2016-07-26 303 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 –

相关问题