2016-12-07 138 views
2

我有一個包含嵌套類和內部類的類。在某些程序中,我使用傳統的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中完成,但我沒有辦法做出上述特定情況。 有什麼建議嗎?

回答

6

的follwoing代碼工作很適合我:

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

這是很好的代碼,你可以在這裏完全回答你自己的問題,甚至接受它們。 +1 – Eugene

5

我強烈建議你看最近Devoxx Belgium presentation "Optional - The Mother of All Bikesheds" by Stuart Marks。斯圖爾特描述了最初的意圖,最佳實踐和使用它的不良做法。

特別是使用領域可選,從演示幻燈片引述:

  • 爲什麼不使用可選的領域?在領域
    • 更多的是風格的問題不是一個正確的問題
    • 使用可選往往源於盲目的慾望,以消除可空字段。
    • 記得,消除空值不是可選
  • 使用領域可選目標..
    • 每個字段創建另一個對象
    • 介紹從內存上的每場讀一個相關負載
    • 凌亂你的代碼
    • 到什麼好處?鏈式方法的能力?

爲了你的榜樣,特別是:

  1. 爲什麼outer != null檢查?它剛剛創建!
  2. 如果Nested實例需要是Outer部分和NestedInner部分有他們的建設者的組成部分,並與一些@NotNull代碼防範或編程方式檢查。
+4

感謝您鏈接到我的演講! –

+1

感謝您爲java社區帶來這樣的洞察! – dimitrisli