Can Java 8 Streams operate on an item in a collection, and then remove it?
Java Streams允许我们采用 Collection
,并在其上使用stream()
方法来接收其所有元素的流。其中包含许多有用的方法,例如filter()
,map()
和forEach()
,这些方法使我们可以对内容使用lambda操作。
方法1:(我喜欢用)
使用partitioningBy
收集器:
Map<Boolean, Set<Item>> map =
set.stream()
.collect(partitioningBy(Item::qualify, toSet()));
map.get(true).forEach(i -> ((Qualifier)i).operate());
set = map.get(false);
它可能会更有效,因为它避免了两次迭代该集合,一次用于过滤流,然后一次用于删除相应的元素。
方法2:removeIf
set.removeIf(item -> {
boolean removeItem=item.qualify();
if (removeItem){
item.operate();
}
return removeItem;
});
如果item.operate()始终返回true,则可以非常简洁地进行操作。
set.removeIf(item -> item.qualify() && item.operate());
就阅读性,使用迭代器会更好。循环通常比流式解决方案更具可读性,即使它们更冗长。
方法3:filter
当然在 filter
中使用 也是可以得
set = set.stream().filter(item -> {
if (item.qualify()) {
((Qualifier) item).operate();
return false;
}
return true;
}).collect(Collectors.toSet());