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

Di *_*Zou 4 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())
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

所以有时候,执行完后filter,my中的所有项目List<Foo.Builder>都会被过滤掉。然后在我的期末考试中HashMap,我有这样的条目:{"someStr" -> []}。我想删除值为空列表的键值对。我该怎么做呢?在代码中可以做到这一点吗.stream().collect(Collectors.toMap(...))?谢谢!

Naz*_*iuk 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));
Run Code Online (Sandbox Code Playgroud)

  • `pair` 是构造 Map.Entry&lt;K, V&gt; 对象的辅助函数。由于 Entry 是通用的,我创建的这个函数也是通用的。有关文档中泛型的更多信息 https://docs.oracle.com/javase/tutorial/java/generics/types.html (2认同)