在流Java 8结束时使用count有什么用

时间:2018-03-31 21:27:42

标签: count java-8 java-stream

我对此代码中使用count()的实用程序有点困惑:

Stream.iterate(1, (Integer n) -> n + 1)
    .peek(n -> System.out.println("number generated  - " + n))
    .filter(n -> (n % 2 == 0))
    .peek(n -> System.out
    .println("Even number filter passed for  –" + n))
    .limit(5).count();

将count()添加到流的末尾,我得到我想要的,这是显示这个结果:

number generated - 1 number generated - 2 Even number filter passed for –2 number generated - 3 number generated - 4 Even number filter passed for –4 number generated - 5 number generated - 6 Even number filter passed for –6 number generated - 7 number generated - 8 Even number filter passed for –8 number generated - 9 number generated - 10 Even number filter passed for –10

但如果我从流语句的末尾删除count(),我没有得到任何结果。

3 个答案:

答案 0 :(得分:3)

您需要在流上执行终端操作才能发生任何事情。如果丢弃.count(),则流基本上什么都不做。考虑方法peekfilter等等,只需要接受一个函数并将其放在要执行的函数的内部队列中。
只有在您使用一个终端操作之后才会执行记住的功能,之后您不再拥有流但有一些结果或根本没有结果。 countcollectreduceforEach就是这样的终端操作。

"Stream operations and pipelines" section of the docs中详细了解它,并查看the Stream docs中的函数,了解哪些方法是终端的,哪些方法不是。

答案 1 :(得分:2)

正如his answer&#34中的@ luk2302所提到的,你需要在流上执行终端操作以发生任何事情"。

为了扩展这一点,有两种类型的流操作,即操作是惰性的中间操作。懒惰的意思是尽可能晚或只在需要时执行;或者操作是尽快或立即的意思。

在您提供的示例中,所有操作栏#dropdown-text-input{ margin-top: 400px; } 都是中间操作,除非终端操作另有说明,否则它们不会呈现数据处理。

count()操作急切(即终端),因此它将呈现整个流的处理。

要确定管道中的方法是中间(懒惰)还是终端(渴望),您只需要查看方法返回的类型。

规则很简单。如果流管道中的方法返回流,则它是一个中间操作,因此是惰性的。如果流管道中的方法返回任何其他内容,那么它就是一个终端操作,因此渴望。

答案 2 :(得分:1)

流操作有两种类型 - 中间终端操作。

中间操作是 lazy ,这意味着它们在调用时不会在流管道上执行,而只是向管道添加一个阶段。

遇到终端操作时执行管道。因此,终端操作渴望

作为终端操作之一的Count()执行流管道并在删除它时给出结果,管道只有中间操作,因此不进行评估,因此没有结果。