本系列总结自《Java8实战》及个人实践
背景:在平时开发过程中我们都会经常遇到NullPointerException这样的异常,这说明是空指针null调用的结果,关于空指针null的出现,仅仅是因为使缺失变量值的实现起来方便,其他语言也有各种替代方案,Java8使用Optional取代null
解决:我们可能会使用嵌套判断null或者遇到null值返回来避免NullPointerException,更优雅的方式是使用Optional来解决,使用Optional并不会消除每一个null引用,但如果在代码中持续使用Optional,能非常清晰的界定变量值的缺失是结构上的问题,还是算法上的问题,或者是数据中的问题。
理解:Optional对象可看作一种特殊的集合数据,它至多包含一个元素,它可以让API调用者明确知道它可以接受一个空值或者返回一个空值。
注意点:1、嵌套Optioanal,如果Optional对象使用map方法,返回值仍是一个Optional对象,这就会导致最外层的optional对象包含了另一个optional对象的值,因为map操作的其实还是Optional里面的元素,而不是Optional。使用flatMap,如果Function的返回值是一个Optional对象,flatMap方法就将其直接返回。
例如:User类包含一个Optional<Phone>,表示用户可能有手机,也有可能没有手机。
Optional<User> optUser = Optional.ofNullable(new User("任我行", "男", 55, phone1));
//由此可以说明,第一个map返回的值是Optional<<Optional<Phone>>>,第二个map返回的值是Optional<Phone>
Object phoneByMap = ((Optional<Phone>)optUser.map(User::getPhone).map(Optional::get)).get().getName();
System.out.println(phoneByMap);
//使用flatap则只会返回一层Optional<Phone>,如果为null,返回默认值Noknown
String phoneByFlatMap = optUser.flatMap(User::getPhone).map(Phone::getName).orElse("Noknown");
System.out.println(phoneByFlatMap);
其他方法:get(),orElse(T),orElseGet(Supplier<? extends T> other),orElseThrow(Supplier<? extends T> exception),ifPresent(Consumer<? super T> consumer),filter(Predicate<? super T> predicate),未完待续。