如何使用Optional来检查java 8中的空值?

Kay*_*ayV 2 java optional java-8 java-stream

我有一个包含嵌套和内部类的类.在某些程序中,我使用遗留java方式中的相等运算符检查对象的空值.以下是我的代码片段:

class Outer {
    Nested nested;
    Nested getNested() {
        return nested;
    }
}
class Nested {
    Inner inner;
    Inner getInner() {
        return inner;
    }
}
class Inner {
    String foo;
    String getFoo() {
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何对引用变量进行空检查:

Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
    System.out.println(outer.nested.inner.foo);
}
Run Code Online (Sandbox Code Playgroud)

我知道这也可以使用java 8的Optional类来完成,但是我没有办法在上面的特定场景中做同样的事情.有什么建议吗?

Kay*_*ayV 8

以下代码对我很有用:

Optional.of(new Outer())
    .map(Outer::getNested)
    .map(Nested::getInner)
    .map(Inner::getFoo)
    .ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)


dim*_*sli 6

我强烈建议你观看最近的Devoxx比利时演讲报告"可选 - 所有Bikesheds的母亲"作者Stuart Marks.Stuart描述了使用它的初始意图,最佳实践和不良实践.

特别是在字段中使用Optional,从演示文稿幻灯片中引用:

  • 为什么不在字段中使用可选项?
    • 风格问题多于正确性问题
    • 在字段中使用Optional通常源于消除可空字段的盲目愿望.
    • 记住,消除空值不是Optional的目标
  • 在字段中使用可选..
    • 为每个字段创建另一个对象
    • 在每个字段读取时从内存引入依赖负载
    • 弄乱你的代码
    • 有什么好处?连锁方法的能力?

特别是你的例子:

  1. 为什么outer != null检查?它刚刚被创造出来了!
  2. 如果Nested情况需要成为其中的一部分OuterInner部分Nested有它们的构造函数的一部分,并与一些看守@NotNull代码或编程方式检查.

  • 感谢您关注我的演讲! (4认同)