我想从地图中过滤多个对象,如下所示:
目前我使用两种方法
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("["));
有更好的过滤和删除方法吗?
答案 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)
包含所有其他地图。