Java流限制与循环性能标准

gopyfrb3  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(76)

在一个例子中,我需要一个集合中的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?
我确实尝试了这两种方法,我试图找出是否有一个流符合我的性能标准。

kjthegm6

kjthegm61#

将流水线操作视为一系列人将水桶传递给另一个人以灭火。
每个人都被要求另一个水桶,然后转向后面的人,要求一个水桶,等等,直到水源(溪流的源头)。
所以在第二种方法中你不需要遍历整个集合,流中的每个操作都负责向它之前的操作请求另一个项。
因此,当链的limit(n)部分达到极限时,它不再从它前面的部分请求元素。相反,如果它前面的操作转向它并请求下一个“桶”,它会告诉它“我没有更多的”。
这意味着对于收集器或limit(n)操作之后的任何东西来说,在n元素之后,它将获得“流结束”并相应地完成其操作。

相关问题