2016-07-26 134 views
0

因此,這裏是我的代碼:在Java中使用Collectors.toMap時,如何跳過將條目添加到新地圖?

HashMap<String, List<Foo.Builder>> strFooMap = new HashMap<>(); 
// add stuff to strFooMap and do other things 
return new HashMap<>(strFooMap.entrySet() 
    .stream() 
    .collect(Collectors.toMap(Entry::getKey, 
     entry -> entry 
      .getValue() 
      .stream() 
      .filter(builder -> { 
       // do some conditional stuff to filter 
      }) 
      .map(builder -> { 
       return builder.build(); 
      }) 
      .collect(Collectors.toList()) 
     ) 
    ) 
); 

所以有的時候,做filter後,在我的List<Foo.Builder>將被過濾掉所有的項目。然後在我的最後HashMap,我有這樣的條目:{"someStr" -> []}。我想刪除值爲空列表的鍵值對。我會如何去做這件事?在.stream().collect(Collectors.toMap(...))的代碼中可以這樣做嗎?謝謝!

+2

請包含更多信息,例如'Foo.Builder'方法和返回類型。另外,你爲什麼要將返回的地圖複製到另一個'HashMap'? – shmosel

+2

你會在收集之前過濾掉它? – Tunaki

回答

2

其中一個解決方案是在收集結果映射之前移動值轉換。它爲您提供了過濾空值的可能性

List<Foo> transformValue(List<Foo.Builder> value) { 
    //original value transformation logic 
} 

<K,V> Entry<K,V> pair(K key, V value){ 
    return new AbstractMap.SimpleEntry<>(key, value); 
} 

strFooMap.entrySet().stream() 
     .map(entry -> pair(entry.getKey(), transformValue(entry.getValue())) 
     .filter(entry -> !entry.getValue().isEmpty()) 
     .collect(toMap(Entry::getKey, Entry::getValue)); 
+0

我對java很陌生(特別是lambda),你能簡單地解釋一下中間部分的含義嗎?那是一個帶有Key,Value作爲回報的泛型類嗎? –

+2

'pair'是構造Map.Entry 對象的幫助函數。既然Entry是通用的,我已經創建了這個函數也是通用的。有關文檔中泛型的更多信息,請參閱https://docs.oracle.com/javase/tutorial/java/generics/types.html –

相關問題