2017-09-25 41 views
0

使用可選對象時檢查對象克隆不同類型的對象。Java 8可選用於在分層對象中執行空檢查

class A{ C cObj, List<B> bList;} 

class B{ C cObj; List<C> cList;} 

class C { String label; String value;} 

class D{ String name; String Age; String addressCode;} 

映射A - > d

d.setAddessCode(A.getBlist().get(0).getcList().get(0).getValue()); 

使用Java 8可選

A.getBlist().get(0).getcList().get(0).getValue() 

我試圖

d.setAddessCode(Optional.ofNullable(A).map(A::getBList).map(Stream::of).orElseGet(Stream::empty).findFirst().map(B::getCList).map(Stream::of).orElseGet(Stream::empty).findFirst().map(C::getValue).orElse(null))); 

我怎麼能在列表檢查空如何檢查空並一起重視。

+0

你如何由C到d? – shmosel

+2

來自B的orElseGet(Stream :: empty)'應該已經爲你做了,不是嗎? – nullpointer

+0

爲什麼只有空檢查?如果'bList'非空而是空? – Andreas

回答

4

沒有必要使用Streams。下面是代碼null和空檢查:

d.setAddressCode(Optional.ofNullable(a) 
         .map(A::getbList) 
         .filter(bList -> ! bList.isEmpty()) 
         .map(bList -> bList.get(0)) 
         .map(B::getcList) 
         .filter(cList -> ! cList.isEmpty()) 
         .map(cList -> cList.get(0)) 
         .map(C::getValue) 
         .orElse(null)); 

可以與小幫手方法進行簡化:

public class MyUtils { 
    public static <E> E getFirst(List<E> list) { 
     return (list == null || list.isEmpty() ? null : list.get(0)); 
    } 
} 
d.setAddressCode(Optional.ofNullable(a) 
         .map(A::getbList) 
         .map(MyUtils::getFirst) 
         .map(B::getcList) 
         .map(MyUtils::getFirst) 
         .map(C::getValue) 
         .orElse(null)); 
+0

如果列表中的第一個元素爲'null',該怎麼辦? –

+0

@LukeLee然後'addressCode'將是'null'。 – Andreas

+0

@LukeLee你*想*?您是否閱讀過文檔**,即['map()']的javadoc(https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#map- java.util.function.Function-)?如果你這樣做了,你會知道它是否會導致NPE。 – Andreas