如果我从流 API 在 filter() 之后调用 limit() 会发生什么情况?

下面的代码会筛选元素,直到找到 3 个通过筛选方法的元素,还是筛选所有元素?

manyItems.stream()
    .filter(it -> it.getValue > 100)
    .limit(3)
    ...


千巷猫影
浏览 95回答 2
2回答

慕桂英546537

filter()具有惰性执行。这意味着当你调用它时,它实际上并没有做任何正确的事情。相反,它只是返回一个新的,它将包含遍历时与给定元素匹配的元素。StreamPredicate由于是短路状态的中间操作,因此它将处理直到它达到极限和短路。这意味着当您调用 时,它将在遍历时返回仅包含元素的新 Stream。由于只有遍历足以达到给定的大小,因此实际上只会过滤掉所需数量的元素。limit()Streamfilterlimitfilter我们可以通过调用来测试这一点:peek()Arrays.stream(new int[] {1, 2, 2, 2, 2})       .filter(e->  e > 1)       .peek(System.out::println)       .limit(3)       .average();(其中可以是任何本身不会短路的终端操作)average()哪些输出:2 2 2(请注意,调用后最后两个不会出现filter())

慕桂英3389331

该方法将首先应用过滤器,然后,之后,将对过滤的流调用限制。您可以轻松尝试编写测试。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java