【发布时间】:2018-09-24 11:36:04
【问题描述】:
我已经读到流在管道中被延迟评估。除非在表达式上调用终端操作,否则不会执行它。但是,这种对表达式的惰性求值有什么好处呢?有人可以用一些例子解释一下吗
【问题讨论】:
-
管道,终端操作 - 你指的是
Stream?
我已经读到流在管道中被延迟评估。除非在表达式上调用终端操作,否则不会执行它。但是,这种对表达式的惰性求值有什么好处呢?有人可以用一些例子解释一下吗
【问题讨论】:
Stream?
Java 中 流管道的延迟评估 与 lambda 无关。
流管道中除最后一个站点之外的所有站点仅在最后一个站点请求更多数据时进行评估。当最后一个站从上一个站拉出一秒时,那个站从它之前的站拉,依此类推,直到最终对新数据的请求一直到供应商。然后供应商提供下一个值,该值通过管道向后(实际上是向前)传播到最后一个阶段(收集器或 forEach)并重复循环。
这种方法不需要管道实现过度生产和/或缓冲任何东西。这对于 CPU 和内存占用非常有用,这通常是 Java 应用程序的一个很大的偏差。
例子:
Stream
.generate(new Random(42)::nextLong) // <-- supplies the next random number every time the next station pulls it
.limit(5) // <-- pulls from the generator when is pulled itself
// terminates the pipeline after 5 pulls
.collect(toList()); // <-- pulls data from the pipeline into the list
【讨论】: