java 8 - 有没有一种很好的方法来过滤和从地图中删除?

时间:2015-07-22 11:04:05

标签: java java-8 java-stream

我想从地图中过滤多个对象,如下所示:

  • 使用过滤结果创建新地图
  • 从原始地图中删除

目前我使用两种方法

Map<String, MyObject > map = scenarioFieldsMap.entrySet().stream()
            .filter(e -> e.getKey().contains("["))
            .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()));

scenarioFieldsMap.entrySet().removeIf(e -> e.getKey().contains("["));

有更好的过滤和删除方法吗?

2 个答案:

答案 0 :(得分:9)

第二步可以更高效,如果不是迭代所有键(或条目),只删除其他地图中的键:

scenarioFieldsMap.keySet().removeAll(map.keySet());

我假设您打算从原始scenarioFieldsMap中删除条目,而不是从您在第一步中创建的新地图中删除。

答案 1 :(得分:1)

作为替代方案,您可以使用partitioningBy收集器:

Collector<Entry<String, MyObject>, ?, Map<Boolean, Map<String, MyObject>>> collector = 
    Collectors.partitioningBy(e -> e.getKey().contains("["),
                Collectors.toMap(Entry::getKey, Entry::getValue));
Map<Boolean, Map<String, MyObject>> maps = scenarioFieldsMap.entrySet()
        .stream().collect(collector);

这样您就不会修改原始地图,而是创建两个新地图:maps.get(true)是地图,其中包含"["maps.get(false)包含所有其他地图。