添加到数组时从地图中删除? (拉姆达)

时间:2016-01-15 00:22:04

标签: java lambda

我想迭代一个Map,对值运行一个布尔函数,并将真值附加到List。我也希望在执行此操作时从地图中删除带有错误值的键。我怎么用lambda来完成这个?从这个answer我可以做后者,但我不确定如何将它们组合在一个lambda函数中。

编辑: 地图是

<String, String>

我有一个布尔方法checkCondition(string)

3 个答案:

答案 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;已添加到列表中。