java中流的惰性计算的优点

btxsgosb  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(99)

我曾经读到过,流在管道中被惰性地评估。除非在表达式上调用终端操作,否则不会执行它。但是,这种对表达式的惰性求值有什么好处呢?有人能举例说明一下吗

mbzjlibv

mbzjlibv1#

Java中 stream pipelines 的惰性求值与lambdas无关。
只有当最后一个站要求更多数据时,才评估 * 流管道 * 中除最后一个站之外的所有站。当最后一个站从最后一个站拉取一秒时,那个站从它之前的一个站拉取,依此类推,直到最后新数据的请求一路送到供应商。然后,供应商提供下一个值,该值通过管道被传播回(实际上是向前)到最后一个阶段(收集器或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

相关问题