我对此代码中使用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(),我没有得到任何结果。
答案 0 :(得分:3)
您需要在流上执行终端操作才能发生任何事情。如果丢弃.count()
,则流基本上什么都不做。考虑方法peek
和filter
等等,只需要接受一个函数并将其放在要执行的函数的内部队列中。
只有在您使用一个终端操作之后才会执行记住的功能,之后您不再拥有流但有一些结果或根本没有结果。 count
,collect
,reduce
,forEach
就是这样的终端操作。
在"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()执行流管道并在删除它时给出结果,管道只有中间操作,因此不进行评估,因此没有结果。