У меня есть метод, который должен удалить любой элемент, перечисленный в (маленьком) Set<K> keysToRemove
из (потенциально большого) Map<K,V> from
. Но 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());
Я нахожу это немного более кратким, но я также считаю, что лямбда слишком неуклюжа.
Какие-нибудь предложения, как достигнуть того же самого результата менее неуклюжими способами?