我有一个要转换和过滤的 Java 地图。作为一个简单的例子,假设我想将所有值转换为整数,然后删除奇数条目。
Map<String, String> input = new HashMap<>();
input.put("a", "1234");
input.put("b", "2345");
input.put("c", "3456");
input.put("d", "4567");
Map<String, Integer> output = input.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> Integer.parseInt(e.getValue())
))
.entrySet().stream()
.filter(e -> e.getValue() % 2 == 0)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(output.toString());
这是正确的并产生: {a=1234, c=3456}
但是,我不禁想知道是否有办法避免调用 .entrySet().stream()
两次。
有没有一种方法可以同时执行转换和过滤操作,并在最后只调用一次 .collect()
?
原文由 Paul I 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,您可以将每个条目映射到另一个临时条目,该条目将保存键和解析的整数值。然后您可以根据它们的值过滤每个条目。
请注意,我使用了
Integer.valueOf
而不是parseInt
因为我们实际上想要一个盒装的int
。如果你有幸使用 StreamEx 库,你可以很简单地做到这一点: