2017-09-25 78 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