如何使用可选来检查Java 8中的空值?
问题描述:
我有一个包含嵌套类和内部类的类。在某些程序中,我使用传统的java方式使用equal运算符来检查对象的空值。以下是我的代码片段:如何使用可选来检查Java 8中的空值?
class Outer {
Nested nested;
Nested getNested() {
return nested;
}
}
class Nested {
Inner inner;
Inner getInner() {
return inner;
}
}
class Inner {
String foo;
String getFoo() {
return foo;
}
}
而且这里是我怎么做的参考变量null检查:
Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
System.out.println(outer.nested.inner.foo);
}
我知道这也可以使用可选级的Java 8中完成,但我没有办法做出上述特定情况。 有什么建议吗?
答
的follwoing代码工作很适合我:
Optional.of(new Outer())
.map(Outer::getNested)
.map(Nested::getInner)
.map(Inner::getFoo)
.ifPresent(System.out::println);
答
我强烈建议你看最近Devoxx Belgium presentation "Optional - The Mother of All Bikesheds" by Stuart Marks。斯图尔特描述了最初的意图,最佳实践和使用它的不良做法。
特别是使用领域可选,从演示幻灯片引述:
- 为什么不使用可选的领域?在领域
- 更多的是风格的问题不是一个正确的问题
- 使用可选往往源于盲目的欲望,以消除可空字段。
- 记得,消除空值不是可选
- 使用领域可选目标..
- 每个字段创建另一个对象
- 介绍从内存上的每场读一个相关负载
- 凌乱你的代码
- 到什么好处?链式方法的能力?
为了你的榜样,特别是:
- 为什么
outer != null
检查?它刚刚创建! - 如果
Nested
实例需要是Outer
部分和Nested
Inner
部分有他们的建设者的组成部分,并与一些@NotNull
代码防范或编程方式检查。
+4
感谢您链接到我的演讲! –
+1
感谢您为java社区带来这样的洞察! – dimitrisli
这是很好的代码,你可以在这里完全回答你自己的问题,甚至接受它们。 +1 – Eugene