如何使用可选来检查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); 
+1

这是很好的代码,你可以在这里完全回答你自己的问题,甚至接受它们。 +1 – Eugene

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

特别是使用领域可选,从演示幻灯片引述:

  • 为什么不使用可选的领域?在领域
    • 更多的是风格的问题不是一个正确的问题
    • 使用可选往往源于盲目的欲望,以消除可空字段。
    • 记得,消除空值不是可选
  • 使用领域可选目标..
    • 每个字段创建另一个对象
    • 介绍从内存上的每场读一个相关负载
    • 凌乱你的代码
    • 到什么好处?链式方法的能力?

为了你的榜样,特别是:

  1. 为什么outer != null检查?它刚刚创建!
  2. 如果Nested实例需要是Outer部分和NestedInner部分有他们的建设者的组成部分,并与一些@NotNull代码防范或编程方式检查。
+4

感谢您链接到我的演讲! –

+1

感谢您为java社区带来这样的洞察! – dimitrisli