如何将这段代码简化为单个lambda表达式?思路是有一个地图列表,我想使用键过滤创建一个新的地图列表。在这个例子中,我希望重新映射它,只保留键“x”和“z”。
Map<String, String> m0 = new LinkedHashMap<>();
m0.put("x", "123");
m0.put("y", "456");
m0.put("z", "789");
Map<String, String> m1 = new LinkedHashMap<>();
m1.put("x", "000");
m1.put("y", "111");
m1.put("z", "222");
List<Map> l = new ArrayList<>(Arrays.asList(m0, m1));
List<Map> tx = new ArrayList<>();
for(Map<String, String> m : l) {
Map<String, String> filtered = m.entrySet()
.stream()
.filter(map -> map.getKey().equals("x") || map.getKey().equals("z"))
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
tx.add(filtered);
}
System.err.println("l: " + l);
System.err.println("tx: " + tx);
输出:
l: [{x=123, y=456, z=789}, {x=000, y=111, z=222}]
tx: [{x=123, z=789}, {x=000, z=222}]
map.keySet().retainAll(Arrays.asList("x", "z"))
的东西。 (编辑:但顺便说一句,OP的代码使用收集器进行复制,因此这些并不完全相同。) - RadiodefremoveIf
的解决方案也会受益于表达式形式,并在首次使用.keySet()
时而不是在Entry
上调用.getKey()
两次。代码如下:l.forEach(map -> map.keySet().removeIf(k -> !k.equals("x") && !k.equals("z")));
- Holger