• java8新特性专题之九、Java8 Optional优雅空值判断的示例代码


    先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。

    1、Optional(T value),empty(),of(T value),ofNullable(T value)

    这四个函数之间具有相关性,因此放在一组进行记忆。

    先说明一下,Optional(T value),即构造函数,它是private权限的,不能由外部调用的。其余三个函数是public权限,供我们所调用。那么,Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。好吧,这么说还是比较抽象。直接上Optional(T value)构造函数的源码,如下图所示

    方式一:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public static void implement(User user) throws Exception {
    //        原始 ---> 01
            before01(user);
    //        优化 ---> 01
            upgrade01(user);
        }
     
        public static String before01(User user) throws Exception {
    //        if(user!=null){
    //            if(user.getAddress()!=null){
    //                Address address = user.getAddress();
    //                if(address.getName()!=null){
    //                    return address.getName();
    //                }
    //            }
    //        }
    //        throw new Exception("取值错误");
            if (null != user && null != user.getAddress() && null != user.getAddress().getName()) {
                return user.getAddress().getName();
            }
            throw new Exception("取值错误");
        }
     
        public static String upgrade01(User user) throws Exception {
            return Optional.ofNullable(user)
                    .map(user1 -> user1.getAddress())
                    .map(user2 -> user2.getName())
                    .orElseThrow(() -> new Exception("取值错误"));
        }
     方式二:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void before02(User user){
            if (null != user){
                test();
            }
        }
     
        public static void upgrade02(User user){
            Optional.ofNullable(user).ifPresent(user1 -> test());
        }

    方式三:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public static User before03(User user) throws Exception{
            if(user!=null){
                String name = user.getName();
                if("King".equals(name)){
                    return user;
                }
            }else{
                user = new User();
                user.setName("King");
                return user;
            }
            throw new Exception("取值错误");
        }
     
        public static void upgrade03(User user){
            Optional.ofNullable(user)
                    .filter(user1 -> "King".equals(user.getName()))
                    .orElseGet(() -> {
                        User user2 = new User();
                        user2.setName("King");
                return user2;
            });
        }
    来源:https://www.jb51.net/article/211353.htm
  • 相关阅读:
    日报 18/05/29
    jsvascript === 和==的区别
    分享个数组
    ROC曲线绘制
    DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]
    利用JAX-WS 开发web服务
    菜鸟的成长之路——在清华特奖经验分享交流会上的演讲
    一段小代码的思考
    关于Vector中的元素中含有指针成员的情况
    关于职业规划——好帖【转载】
  • 原文地址:https://www.cnblogs.com/konglxblog/p/15974002.html
Copyright © 2020-2023  润新知