我想迭代一个Map,对值运行一个布尔函数,并将真值附加到List。我也希望在执行此操作时从地图中删除带有错误值的键。我怎么用lambda来完成这个?从这个answer我可以做后者,但我不确定如何将它们组合在一个lambda函数中。
编辑: 地图是
<String, String>
我有一个布尔方法checkCondition(string)
答案 0 :(得分:2)
如果要删除等于“2”的值。
map.entrySet().removeIf(e -> e.getValue().equals("2") ? list.add(e.getValue()) : false);
答案 1 :(得分:0)
这是一种方法(虽然不是唯一的方法):
List<String> list = new ArrayList<>();
map = map.entrySet().stream()
.filter(t -> checkCondition(t.getValue()))
.peek(t -> list.add(t.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
答案 2 :(得分:0)
使用流可以获得ConcurrentModificationException
,但您可以通过将Iterator
与lambda表达式相结合来实现。
示例:
List<String> myList = new ArrayList<>();
Map<String, String> myMap = new HashMap<>();
Predicate<String> filter = "foo"::equals;
myMap.put("a", "foo");
myMap.put("b", "bar");
Iterator<Map.Entry<String, String>> iterator = myMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> element = iterator.next();
if (filter.test(element.getValue())) {
myList.add(element.getValue());
} else {
iterator.remove();
}
}
System.out.println("List: " + myList);
System.out.println("Map: " + myMap);
输出将是:
List: [foo]
Map: {a=foo}
&#34;杆&#34;已被删除&#34; foo&#34;已添加到列表中。