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

时间:2016-12-07 12:03:12

标签: java java-8 java-stream optional

我有一个包含嵌套和内部类的类。在某些程序中,我使用遗留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;
    }
}

以下是我对引用变量进行空检查的方法:

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

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

2 个答案:

答案 0 :(得分:8)

以下代码对我有用:

Optional.of(new Outer())
    .map(Outer::getNested)
    .map(Nested::getInner)
    .map(Inner::getFoo)
    .ifPresent(System.out::println);

答案 1 :(得分:6)

我强烈建议你观看最近的Devoxx Belgium presentation "Optional - The Mother of All Bikesheds" by Stuart Marks。 Stuart描述了使用它的初始意图,最佳实践和不良实践。

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

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

特别是你的例子:

  1. 为什么outer != null检查?它刚刚创建!
  2. 如果Nested实例需要成为Outer的一部分且Inner部分Nested将其作为构造函数的一部分并使用某些@NotNull代码或以编程方式检查。