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

4

以下是我的代码:

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
1个回答

5

解决方案之一是在收集结果到映射之前移动值转换。这样可以过滤掉空值。

 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));

我对Java(尤其是Lambda)还比较新,你能简要解释一下中间部分的含义吗?那是一个具有Key、Value返回值的通用类吗? - Meik Vtune
2
pair是一个帮助函数,用于构造Map.Entry<K, V>对象。由于Entry是泛型的,所以我创建了这个函数也是泛型的。有关泛型的更多信息,请参阅文档https://docs.oracle.com/javase/tutorial/java/generics/types.html。 - Nazarii Bardiuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接