java8系列之Optional

本系列总结自《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),未完待续。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值