LittleJava 8风格的新增;
如何有效地,我们可以通过在Java 8 API 中包含所有空检查来为以下语句编码
search.getResource()
.getResults().get(0).getCustomer().getPhoneNumber()
我试着如下:(到处都是可选的,对我来说有点奇怪(
List<Result> results = search.getResource().getResults();
Optional<Result> optionalResult = Optional.of(results).orElse(new ArrayList<>()).stream().findFirst();
if(optionalResult.isPresent() && Optional.of(optionalResult.get().getCustomer()).isPresent()) {
Source source = Optional.of(optionalResult.get().getCustomer()).get();
Optional<List<Customer>> customers = Optional.of(source.getCustomers());
if(customers.isPresent() && customers.get().stream().findFirst().isPresent() &&
Optional.of(customers.get().stream().findFirst().get().getPhoneNumber()).isPresent())
dest.setNumber(Integer.parseInt(customers.get().stream().findFirst().get().getPhoneNumber())));
}
你能给我一个更好的方法吗。谢谢
您可以使用Optional
类的map
方法:
final Optional<String> optional = Optional.ofNullable(search.getResource())
.map(resource -> resource.getResults())
.map(results -> results.size() > 0 ? results.get(0) : null)
.map(result -> result.getCustomer())
.map(customer -> customer.getPhoneNumber());
optional.ifPresent(phoneNumber -> {
System.out.println(phoneNumber);
});
OT:为什么不简单地对空安全进行编码?
编码null safe意味着您永远不会从方法显式返回(文字(null
或将其作为参数传入。此外,您总是在传递或返回局部变量之前对其进行null
检查
在Map
集合上,使用getOrDefault
或computeIfAbsent
将为缺少键返回的null
替换为所需类型的Null等效常量。
通常,来回传递null
是错误条件的带内信号,Java对此有异常。
不:绕过Optional
不是一个解决方案,而是问题的另一个体现。Optional
是处理变量的一种优雅方式,而不是在方法中包含null
不要让它逃脱。。。