开心一笑: 会买水果的狗狗

    关注微信公众号

    QQ群:831045818

    app下载

    当前位置:首页> java > 技术文档 > 正文
    optional使用
    发布时间:2023-05-19 09:38:26.0 浏览次数:
    // 获取当前行政区最顶级的省信息名称 没有则显示error
    String result  = Optional.ofNullable(country)
                    .map(Country::getCity)
                    .map(City::getProvince)
                    .map(Province::getName)
                    .orElse("error");
                    
                    
    1、empty()
    empty 方法返回一个不包含值的 Optional 实例,单独使用没什么意义,主要和其他方法搭配使用。
    Optional optional = Optional.empty();
    System.out.println(optional);
    -- 输出结果
    Optional.empty
    
    2、of()
    of 方法会返回一个 Optional 实例,如果传入的值非空,会返回包含指定值的对象;如果传入空,会立刻抛出空指针异常。
    // 非空情况下,会正常返回
    Optional optional = Optional.of("hello world");
    System.out.println(optional);
    -- 输出结果
    Optional[hello world]
    // 为空情况下,会抛空指针异常
    Optional optional = Optional.of(null);
    System.out.println(optional);
    -- 输出结果
    Exception in thread "main" java.lang.NullPointerException
     at java.util.Objects.requireNonNull(Objects.java:203)
     at java.util.Optional.<init>(Optional.java:96)
     at java.util.Optional.of(Optional.java:108)
     
     3、ofNullable()
    ofNullable 方法会返回一个 Optional 实例,如果传入的值非空,会返回包含指定值的对象;如果传入空,会返回不包含任何值的 empty 对象,也就是最开始介绍的Optional.empty()对象。
    // 非空情况下,会正常返回
    Optional optional = Optional.ofNullable("hello world");
    System.out.println(optional);
    -- 输出结果
    Optional[hello world]
    // 为空情况下,会返回 empty 对象
    Optional optional = Optional.ofNullable(null);
    System.out.println(optional);
    -- 输出结果
    Optional.empty
    
    4、isPresent()
    isPresent 方法用来判断实例是否包含值,如果包含非空值,返回 true,否则返回 false。
    // 非空值,返回true
    boolean rs1 =  Optional.ofNullable("hello").isPresent();
    System.out.println(rs1);
    
    // 空值,返回false
    boolean rs2 =  Optional.ofNullable(null).isPresent();
    System.out.println(rs2);
    -- 输出结果
    true
    false
    
    5、get()
    get 方法,如果实例包含非空值,则返回当前值;否则抛出 NoSushElementException 异常。
    // 非空值,返回当前值
    Object rs =  Optional.ofNullable("hello world").get();
    System.out.println(rs);
    -- 输出结果
    hello world
    // 空值,会抛出 NoSushElementException 异常
    Object rs =  Optional.ofNullable(null).get();
    System.out.println(rs);
    -- 输出结果
    Exception in thread "main" java.util.NoSuchElementException: No value present
     at java.util.Optional.get(Optional.java:135)
    
     
    6、ifPresent()
    ifPresent 方法作用是当实例包含非空值时,执行传入的 Consumer,比如调用一些其他方法;如果包含的值为空,不执行任何操作。
    Optional.ofNullable("hello world")
                    .ifPresent( x -> {
                        System.out.println(x);
                    });
    -- 输出结果
    hello world
    
    
    7、filter()
    filter 方法用于过滤不符合条件的值,接收一个Predicate参数,如果符合条件,会返回当前的Optional实例,否则返回 empty 实例。
    Optional.ofNullable("hello world")
                    .filter(x -> x.contains("hello"))
                    .ifPresent(x -> {
                        System.out.println(x);
                    });
    -- 输出结果
    hello world
    
    
    8、map()
    map 方法是链式调用避免空指针的核心方法,当实例包含值时,对值执行传入的Function函数接口方法,并返回一个代表结果值新的Optional实例,也就是将返回的结果再次包装成Optional对象。
    Optional.ofNullable("hello+world")
                    .map(t -> {
                        if(t.contains("+")){
                            return t.replace("+", " ");
                        }
                        return t;
                    }).ifPresent(t -> {
                        System.out.println(t);
                    });
    -- 输出结果
    hello world
    
    
    9、flatMap()
    flatMap 方法与 map 方法类似,唯一不同的地方在于:需要手动将返回的值,包装成Optional实例,并且参数值不允许为空。
    Optional.ofNullable("hello+world")
                    .flatMap(t -> {
                        if(t.contains("+")){
                            t =  t.replace("+", " ");
                        }
                        // 不同之处
                        return Optional.of(t);
                    }).ifPresent(t -> {
                        System.out.println(t);
                    });
    -- 输出结果
    hello world
    
    
    10、orElse()
    orElse 方法作用是如果实例包含非空值,那么返回当前值;否则返回指定的默认值。
    Object rs =  Optional.ofNullable(null).orElse("null");
    System.out.println(rs);
    -- 输出结果
    null
    
    
    11、orElseGet()
    orElseGet 方法作用是如果实例包含非空值,返回这个值;否则,它会执行作为参数传入的Supplier函数式接口方法,并返回其执行结果。
    Object result = Optional.ofNullable(null)
                    .orElseGet(() -> {
                        return "error";
                    });
    System.out.println(result);
    -- 输出结果
    error
    
    
    12、orElseThrow()
    orElseThrow 方法作用是如果实例包含非空值,返回这个值;否则,它会执行作为参数传入的异常类。
    Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("参数为空"));
    -- 输出结果
    Exception in thread "main" java.lang.RuntimeException: 参数为空
     at com.x.x.x.x.OptionalTest.lambda$main$10(OptionalTest3.java:144)
     at java.util.Optional.orElseThrow(Optional.java:290)



    以上就是 JDK8 新增的Optional类的常用方法总结,其中ofNullable、map和orElse方法搭配使用的最多。

    另外orElse、orElseGet、orElseThrow区别如下:

    orElse:如果实例包含空值,返回传入指定的值

    orElseGet:如果实例包含空值,返回传入的方法中返回值

    orElseThrow:如果实例包含空值,返回指定的异常类型

    在实际使用的时候,还得结合具体的场景进行合理选择,有时候并不是全部采用Optional来解决NPE异常代码才更加优雅,比如当前对象比较简单,就是一个简单判断,通过obj != null足以解决问题。

    因此在保证业务功能的正确和稳定性的基础之上,适当的选择相关的工具来优化代码的整洁度和可读性,更能发挥出锦上添花的效果!


    关注"都市百货" 了解南陵

    微信咨询wanglf2r(不拉群 发广告者勿加)

    0
    0
    上一篇:ElasticSearch 上一篇:jpa REGEXP正则使用方式

    评论已有0

    提交评论

    热门评论

    南陵新闻
    公示公告
    常用查询
    风光南陵
    走出南陵
    友情链接