【发布时间】:2019-10-28 04:14:41
【问题描述】:
我有一个方法必须从一些(可能很大)Map<K,V> from 中删除(小)Set<K> keysToRemove 中列出的任何元素。但是removeAll() 不行,因为我需要返回所有实际删除的键,因为地图可能包含也可能不包含需要删除的键。
老派代码直截了当:
public Set<K> removeEntries(Map<K, V> from) {
Set<K> fromKeys = from.keySet();
Set<K> removedKeys = new HashSet<>();
for (K keyToRemove : keysToRemove) {
if (fromKeys.contains(keyToRemove)) {
fromKeys.remove(keyToRemove);
removedKeys.add(keyToRemove);
}
}
return removedKeys;
}
同样,使用流编写:
Set<K> fromKeys = from.keySet();
return keysToRemove.stream()
.filter(fromKeys::contains)
.map(k -> {
fromKeys.remove(k);
return k;
})
.collect(Collectors.toSet());
我觉得这更简洁一些,但我也觉得 lambda 太笨重了。
有什么建议可以以不那么笨拙的方式实现相同的结果吗?
【问题讨论】:
-
如何收集所有可以删除的密钥,然后在该过滤集上调用
removeAll()?或者在fromKeys::remove上“过滤”怎么样? -
我相信并从这里的答案推断,主要来自任何更改的改进是使用
if (fromKeys.remove(keyToRemove)) { removedKeys.add(keyToRemove); }而不是在if (fromKeys.contains(keyToRemove)) { fromKeys.remove(keyToRemove); removedKeys.add(keyToRemove); }中同时使用包含和删除
标签: java lambda java-stream