Java 8 中的绝对空值可选
Optional for definitely null values in Java 8
这是什么感觉?
Optional.of(someLinkToNull).ifPresent(present -> {
System.out.println(present);
});
给出 NullpointerException。
请举个例子,如何使用 Optional(更少的代码)检查 null?
使用ofNullable
静态工厂方法而不是of
——后者不允许值为null
:
Optional.ofNullable(someLinkToNull).ifPresent(present -> {
System.out.println(present);
});
请注意,虽然在学习可选时编写这样的代码很好,但它的通常用例是传递一个本身可能为 null 的对象,通过一系列转换也可能将其减少为 null,而不是疯狂地分支以避免 NPE。在您的情况下,一个简单的空检查是否就足够了(如评论中提到的4castle
)。例如考虑这段毫无意义的代码:
Optional.ofNullable(order)
.map(Order::getCharges)
.flatMap(charges -> charges.stream().filter(ChargeFilters::isFee).findFirst())
.map(Fee::getIssuer)
.map(PaymentIssuer::getAddress)
.map(Address::getStreet)
[...]
这里可能有几处错误:
- 订单可能为空
- 订单可能没有相关费用
- 费用发行方可能没有地址(可能不知道订单是否来自第三方系统)
- 发行人的地址可能没有指定街道(例如,船没有任何与之关联的街道)
如您所见,那里已经至少有四个空检查,而不是像上面那样的一个不错的可选流畅的东西。
这是什么感觉?
Optional.of(someLinkToNull).ifPresent(present -> {
System.out.println(present);
});
给出 NullpointerException。
请举个例子,如何使用 Optional(更少的代码)检查 null?
使用ofNullable
静态工厂方法而不是of
——后者不允许值为null
:
Optional.ofNullable(someLinkToNull).ifPresent(present -> {
System.out.println(present);
});
请注意,虽然在学习可选时编写这样的代码很好,但它的通常用例是传递一个本身可能为 null 的对象,通过一系列转换也可能将其减少为 null,而不是疯狂地分支以避免 NPE。在您的情况下,一个简单的空检查是否就足够了(如评论中提到的4castle
)。例如考虑这段毫无意义的代码:
Optional.ofNullable(order)
.map(Order::getCharges)
.flatMap(charges -> charges.stream().filter(ChargeFilters::isFee).findFirst())
.map(Fee::getIssuer)
.map(PaymentIssuer::getAddress)
.map(Address::getStreet)
[...]
这里可能有几处错误:
- 订单可能为空
- 订单可能没有相关费用
- 费用发行方可能没有地址(可能不知道订单是否来自第三方系统)
- 发行人的地址可能没有指定街道(例如,船没有任何与之关联的街道)
如您所见,那里已经至少有四个空检查,而不是像上面那样的一个不错的可选流畅的东西。