在一个例子中,我需要一个集合中的n个元素,在一个标准的for循环中,如果a到达n个元素,我可以中断,而不需要中断其余的元素。
Collection limitConcition = new ... // Instantiates the collection
for(Item item: myCollection) {
if (item.verifyCondition()) {
// do some magic
limitCondition.add(item);
if (size > limit) break;
}
}
字符串
但是在Java Stream中,我需要做的是:
myCollection.stream()
.map(item -> doSomeMagic())
.filter(//someCondition)
.limit(n)
型
在第二种方法中,我需要遍历集合中的所有元素,然后限制,而在第一种方法中,一旦我达到了我的限制,我就可以突破而不需要遍历其余的元素。我看到了性能问题和内存浪费。在这种情况下,有没有一种方法可以以一种高性能的方式使用Stream?
我确实尝试了这两种方法,我试图找出是否有一个流符合我的性能标准。
1条答案
按热度按时间kjthegm61#
将流水线操作视为一系列人将水桶传递给另一个人以灭火。
每个人都被要求另一个水桶,然后转向后面的人,要求一个水桶,等等,直到水源(溪流的源头)。
所以在第二种方法中你不需要遍历整个集合,流中的每个操作都负责向它之前的操作请求另一个项。
因此,当链的
limit(n)
部分达到极限时,它不再从它前面的部分请求元素。相反,如果它前面的操作转向它并请求下一个“桶”,它会告诉它“我没有更多的”。这意味着对于收集器或
limit(n)
操作之后的任何东西来说,在n
元素之后,它将获得“流结束”并相应地完成其操作。