app*_*ice 5 java null lambda optional java-8
哪种空检更好?
Optional.ofNullable(port).ifPresent(settings::setPort);
Run Code Online (Sandbox Code Playgroud)
要么
if (port != null) {
settings.setPort(port);
}
Run Code Online (Sandbox Code Playgroud)
在Java中,一个Optional值是一个位的融合,其指示存在或不存在,与任意参考类型的值T或原始int,long或double.
从方法返回值时,融合这些特别有用,因为方法只有一个返回值.通常需要使用特殊值,例如null在引用类型的情况下,或者在-1的情况下使用-1 int作为表示"无值"情况的标记.使用Optional作为返回值避免了调用者意外地将sentinel值误用为实际返回值的问题.
鉴于此,代码行如
Optional.ofNullable(port).ifPresent(settings::setPort);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它将一个值与行的第一部分中的当前/不存在位融合,然后立即在行的第二部分中将它们分开.这增加了最终相当简单的任务的复杂性:检查是否port为非null并有条件地执行某些操作.替代代码段:
if (port != null) {
settings.setPort(port);
}
Run Code Online (Sandbox Code Playgroud)
很清楚地表达了它的作用.
确实,if语句占用了比Optional链更多的垂直空间.该Optional链是密集的,但它也很难理解:一个贫穷的权衡.
虽然,您在问题中发布的代码段只是一种避免丑陋的简单方法null-check,但它是有效、正确和空安全的。在这种情况下,请遵循您的个人喜好。
的真正威力Optional是以下方法:
Optional::filter(Predicate<? super T> predicate)它对现值应用过滤器。Optional::map(Function<? super T,? extends U> mapper)它对现值应用映射函数。例如,假设您想从中获取另一个值port以添加到列表中并避免 NPE,如果port是null:
Optional.ofNullable(port).map(port::getSomeValue).ifPresent(settings::setPort);
Run Code Online (Sandbox Code Playgroud)
此外,请避免null-check我经常看到的以下无意义的替换:
if (Optional.ofNullable(port).isPresent()) {
settings.setPort(port);
}
Run Code Online (Sandbox Code Playgroud)