1. 概述
在这个快速教程中,我们将学习对Java 8 Stream中的元素进行操作并在操作完成后将其删除的各种方法。
2. 设置
让我们先定义我们的Item对象。这是一个具有单个int字段的简单对象。
它有一个根据内部值判断对象是否符合操作条件的方法:
class Item {
private int value;
// constructors
public boolean isQualified() {
return value % 2 == 0;
}
public void operate() {
System.out.println("Even Number");
}
}
现在我们可以为Stream创建一个源,它可以是Item的集合:
List<Item> itemList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
itemList.add(new Item(i));
}
3. 过滤元素
在很多情况下,如果我们想对元素的子集做一些事情,我们可以使用Stream#filter方法,我们不需要先删除任何内容:
itemList.stream()
.filter(item -> item.isQualified())
...
4. 操作和删除元素
4.1 Collection.removeIf
我们可以使用Stream来迭代和操作Item的集合。
使用Stream,我们可以应用称为Predicate的lambda函数。
我们可以创建一个Predicate来确定一个Item是否符合操作条件:
Predicate<Item> isQualified = item -> item.isQualified();
我们的谓词将过滤我们要操作的Item:
itemList.stream()
.filter(isQualified)
.forEach(item -> item.operate());
一旦我们完成了对流中项目的操作,我们就可以使用我们之前用于过滤的相同Predicate来删除它们:
itemList.removeIf(isQualified);
在内部,removeIf使用Iterator遍历列表并使用谓词匹配元素。我们现在可以从列表中删除任何匹配的元素。
4.2 Collection.removeAll
我们也可以使用另一个列表来保存已经操作过的元素,然后将它们从原来的列表中移除:
List<Item> operatedList = new ArrayList<>();
itemList.stream()
.filter(item -> item.isQualified())
.forEach(item -> {
item.operate();
operatedList.add(item);
});
itemList.removeAll(operatedList);
与使用Iterator的removeIf不同,removeAll使用简单的for循环来删除列表中的所有匹配元素。
5. 总结
在本文中,我们研究了一种在Java 8 Stream中对项目进行操作然后将其删除的方法。我们还看到了一种使用辅助列表并删除所有匹配元素的方法。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章