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。
仅仅用来学习,如有侵权,联系我,马上删除。