在Java中使用Collectors.toMap时,如何跳过向新地图添加条目?

时间:2016-07-26 20:02:04

标签: java java-8

所以这是我的代码:

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(...))代码中执行此操作?谢谢!

1 个答案:

答案 0 :(得分: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));