2017-05-02 109 views
0

我想做一個嵌套的空檢查,然後清除嵌套對象中地圖中的值,如果地圖不爲空。java 8對象的嵌套空檢查列表

以下是我的假設代碼。我想知道這是否是正確的方式,或者是否有更優雅的解決方案。

package exp.myJavaLab.Experiments; 

    import java.util.*; 

    public class OptionalTest { 

     public Inner inner; 

     public static void main(String[] args) { 

      OptionalTest testObj = new OptionalTest(); 
      Pojo pojo1 = new Pojo(); 
      pojo1.id = 1; 
      Map<String, String> dataMap = new HashMap<>(); 
      dataMap.put("a","b"); 
      pojo1.dataMap = dataMap; 
      Pojo pojo2 = new Pojo(); 
      pojo2.id = 2; 

      Inner inner = new Inner(); 
      inner.pojoList = Arrays.asList(pojo1, pojo2); 

      testObj.inner = inner; 

      System.out.println(testObj); 

      Optional.ofNullable(testObj.inner) 
      .map(Inner::getPojoList) 
      .ifPresent(pojos -> pojos.forEach(pojo -> { 
        if (pojo.getDataMap() != null) { 
         pojo.getDataMap().clear(); 
        } 
       })); 

      System.out.println(testObj); 

     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("OptionalTest{"); 
      sb.append("inner=").append(inner); 
      sb.append('}'); 
      return sb.toString(); 
     } 
    } 

    class Inner { 
     public List<Pojo> pojoList; 

     public List<Pojo> getPojoList() { 
      return pojoList; 
     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("Inner{"); 
      sb.append("pojoList=").append(pojoList); 
      sb.append('}'); 
      return sb.toString(); 
     } 
    } 

    class Pojo { 

     public Map<String, String> dataMap; 
     public int id; 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("Pojo{"); 
      sb.append("dataMap=").append(dataMap); 
      sb.append(", id=").append(id); 
      sb.append('}'); 
      return sb.toString(); 
     } 

     public Map<String, String> getDataMap() { 
      return dataMap; 
     } 

     public int getId() { 
      return id; 
     } 
    } 
+6

'pojos.stream()地圖(POJO :: getDataMap).filter( Objects :: nonNull).forEach(Map :: clear)' – Holger

回答

0

在我看來,集合不應該爲null。

您可以聲明您的pojoListdataMapprivate並實例化它們。 你的課程需要一些add-方法。所以,你一定getDataMap()永遠不會返回null

class Pojo { 
    private Map<String, String> dataMap = new HashMap<>(); 

    public Map<String, String> getDataMap() { 
     return dataMap; 
    } 

    public void add(String key, String value) { 
     dataMap.put(key, value); 
    } 
} 

那麼你不需要檢查null

Optional.ofNullable(testObj.inner) 
.map(Inner::getPojoList) 
.ifPresent(pojos -> pojos.forEach(pojo -> { pojo.getDataMap().clear(); })); 
+3

如果您直接將「Collections should never be null」規則應用於'getPojoList()',則可以進一步簡化代碼:'可選。 ofNullable(testObj.inner).ifPresent(inner - > inner.getPojoList()。forEach(pojo - > pojo.getDataMap()。clear()));' – Holger

+0

@Obeland感謝您的喲你的回答,但上面的代碼是一個假設。所以我的實際代碼確實有getter和setter。我的代碼被生成,因此無法控制getter和setter –