java 8 - 是否有从地图中过滤和删除的好方法?
java 8 - is there a good way to filter and remove from a map?
我想从地图中过滤几个对象,如下所示:
- 使用过滤后的结果创建新地图
- 从原始地图中删除
目前我使用两种方法
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("["));
有没有更好的过滤去除方法?
如果不是遍历所有键(或条目),而是只删除另一个映射中存在的键,第二步会更有效率:
scenarioFieldsMap.keySet().removeAll(map.keySet());
我假设您打算从原始 scenarioFieldsMap
中删除条目,而不是从您在第一步中创建的新地图中删除条目。
作为一种可能的替代方法,您可以使用 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)
包含所有其余地图。
我想从地图中过滤几个对象,如下所示:
- 使用过滤后的结果创建新地图
- 从原始地图中删除
目前我使用两种方法
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("["));
有没有更好的过滤去除方法?
如果不是遍历所有键(或条目),而是只删除另一个映射中存在的键,第二步会更有效率:
scenarioFieldsMap.keySet().removeAll(map.keySet());
我假设您打算从原始 scenarioFieldsMap
中删除条目,而不是从您在第一步中创建的新地图中删除条目。
作为一种可能的替代方法,您可以使用 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)
包含所有其余地图。