2017-06-23 57 views
4

我想使用java可選操作以避免像nullchecks:如何使用Java可選的操作映射多個亞型

if(outher != null && outher.getNested() != null && 
      outher.getNested().getInner() != null && outher.getNested().getAnotherInner() != null) 

我查閱了一些教程在互聯網+ Java的cheatsheet文件,但沒有找到如何解決:outher.getNested.getInner() != null && outher.getNested.getAnotherInner != null部分。

那麼如何做正確的事情,如:

Optional.of(outher) 
.map(Outher::getNested) 
.map(Nested::getInner) 
.map(Nested::getAnotherInner) 
.isPresent(); 

將是真棒

+0

你的代碼似乎很好,只需用Optional.ofNullable替換'Optional.of',因爲'outer'也可以是'null'。那麼你對這個代碼有什麼問題? –

+7

使您的獲得者返回可選,並使用flatMap而不是map。 –

+0

我會嘗試。感謝您的回答 –

回答

3

的問題是,.map(Nested::getInner)返回內蒙古的一個實例,但它應該返回外。

我的建議是:

Optional.ofNullable(outher) 
.map(Outher::getNested) 
.map((outer) -> outer.getInner() == null ? null : outer) 
.map(Nested::getAnotherInner) 
.isPresent(); 

不確定flatMap,因爲你應該對自身映射實體

+3

我會改變第二個'map'操作:'。過濾器(外部 - > outer.getInner()!= null)' – Mario

+0

@MarkusSchreiber什麼是SafeNavigationOperator?無論如何,如果沿途有任何對象爲空,那將會發生異常。 – ekaerovets

+0

SafeNavigationOperator是他寫的一個類xD - >沒有它工作得非常好 –

1

那麼,有使用flatmap如果你真的想一個辦法:

boolean result = Optional.ofNullable(outer) 
      .map(Outer::getNested) 
      .filter(x-> x.getInner() != null) 
      .map(Nested::getAnotherInner) 
      .isPresent();