Java Stream 限制与循环性能标准

问题描述 投票:0回答:1

在某种情况下,我需要具有特定过滤器的集合中的 n 个元素。 在标准 for 循环中,如果达到 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流中我需要做类似的事情:

myCollection.stream()
.map(item -> doSomeMagic())
.filter(//someCondition)
.limit(n)

在第二种方法中,我需要遍历集合中的所有项目,然后进行限制,而在第一种方法中,一旦达到限制,我就可以突破而无需遍历其余元素。 我发现存在性能问题和内存浪费。 在这种情况下有没有办法以高性能的方式使用 Stream ?

我确实尝试了这两种方法,并且我正在尝试找出是否有符合我的性能标准的 Stream。

java java-stream
1个回答
3
投票

将河流管道操作视为一连串的人互相传递水桶来灭火。

每个人都被要求再拿一个水桶,然后转向后面的人再要一个水桶,以此类推,直到水源(溪流的源头)。

所以你不会在第二种方法中遍历整个集合。流中的每个操作都负责向其之前的操作询问另一个项目。

因此,当链的

limit(n)
部分达到极限时,它不再向其之前的部分请求元素。相反,如果它前面的操作转向它并请求下一个“桶”,它会告诉它“我没有更多了”。

这意味着对于收集器或任何遵循

limit(n)
操作的东西,在
n
元素之后,它将获得“流结束”并相应地完成其操作。

© www.soinside.com 2019 - 2024. All rights reserved.