Optional Java 8 引入的一个很有趣的类

空指针异常

Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。

本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。

Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。

之前判断空指针的写法冗长,难以维护。

if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        Country country = address.getCountry();
        if (country != null) {
            String isocode = country.getIsocode();
            if (isocode != null) {
                isocode = isocode.toUpperCase();
            }
        }
    }
}

见证 Optional  奇迹

Optional<User> opt = Optional.of(user);//对象非空
Optional<User> opt = Optional.ofNullable(user);//如果对象即可能是 null 也可能是非 null
Optional<User> emptyOpt = Optional.empty();

访问 Optional 对象的值

opt.get() //这个方法会在值为 null 的时候抛出异常。要避免异常,你可以选择首先验证是否有值
opt.isPresent()//验证是否有值

检查是否有值的另一个选择是 ifPresent() 方法。该方法除了执行检查,还接受一个Consumer(消费者) 参数,如果对象不是空的,就对执行传入的 Lambda 表达式:

返回默认值

Optional 类提供了 API 用以返回对象值,或者在对象为空的时候返回默认值。这里你可以使用的第一个方法是 orElse()。

orElseGet() —— 其行为略有不同。这个方法会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果。

orElseThrow()。它会在对象为空的时候抛出异常,而不是返回备选的值。

这个方法让我们有更丰富的语义,可以决定抛出什么样的异常,而不总是抛出 NullPointerException

转换值

从 map() 和 flatMap() 方法开始。
过滤值
filter

Java 9 增强

我们介绍了 Java 8 的特性,Java 9 为 Optional 类添加了三个方法:or()ifPresentOrElse() 和 stream()

or() 方法与 orElse() 和 orElseGet() 类似,它们都在对象为空的时候提供了替代情况。or() 的返回值是由 Supplier 参数产生的另一个 Optional 对象。

如果对象包含值,则 Lambda 表达式不会执行:

总结

Optional 是 Java 语言的有益补充 —— 它旨在减少代码中的 NullPointerExceptions,虽然还不能完全消除这些异常。

它也是精心设计,自然融入 Java 8 函数式支持的功能。

总的来说,这个简单而强大的类有助于创建简单、可读性更强、比对应程序错误更少的程序。

 

文章来自:https://www.cnblogs.com/zhangboyu/p/7580262.html。

仅仅用来学习,如有侵权,联系我,马上删除。


posted @ 2021-08-16 17:27  精进的浩然兄  阅读(51)  评论(0编辑  收藏  举报