Java8 使用Optional处理null

三种构造

// obj 不能为null值,否则直接快速抛出NullpointException
Optional.of(obj);

// 允许为null,但是如果传入null,就得到了 Optional.empty()
//         不是null,则会获取 Optional.of(obj)
Optional.ofNullable(obj)

// 空的Optional
Optional.empty()

何时使用每种构造?

Optional.of(obj):

  1. 明确obj不可能为null
  2. 明确obj为null,并快速抛出异常

Optional.ofNullable(obj):

  1. 不明确obj是否为null,又要对obj进行处理的

存在即返回,无则提供默认值

User u = Optional.ofNullable(user).orElse(User.UNKNOWN_USER);

存在即返回,无则由函数生成

User u = Optional.ofNullable(user).orElseGet(() -> new User());

存在则返回, 无则抛出异常

User u = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());

变种,存在则返回,无则抛出空指针异常:

User u = Objects.requireNonNull(user,"用户信息获取异常,无法进行操作");

存在才执行, 无则不会执行

Optional.ofNullable(user).ifPresent(uu -> System.out.println(uu));

map 处理级联数据

有一 user 对象,不知是否为null
如果为null,返回null
如果不为null,返回 name
如果name 为null,返回 null
如果name 不为null, 将name 转换为大写

这种级联的null 处理,需要使用map, map可以嵌套无数层。

String n = Optional.ofNullable(user).map(u -> u.getName()).map(name -> "姓名:" + name).orElse(null);

flatMap:flatMapmap 类似,只是参数不同,他的函数参数需要返回 Optional类型:

String n = Optional.ofNullable(user).flatMap(u -> Optional.ofNullable(u.getName())).map(name -> "姓名:" + name).orElse(null);

总结

一句话小结: 使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(),Optional.map() 等这样的方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值