首页 > 解决方案 > 将 Stream 分配给变量:好还是不好?

问题描述

如果我将流分配给变量,例如

final Stream<String> docs = REST_CLIENT.postLS(RestClient.appendSegmentToPath(bucketUrl, "_bulk_get"),

这是一个坏主意吗?因为流需要将数据存储在内存中——就像 Collection 一样。但与集合不同的是,流不指定如何存储数据——作为数组、树或其他

标签: javajava-stream

解决方案


流被懒惰地评估,它们不像作为数据持有者的集合。因此,在您的代码中,这Stream<String>是一个String数据源,当您执行流操作并进行终端操作时,将评估该流管道并据说已被消耗,直到那时没有内存用于存储来自流源的数据.

这是根据Java 文档

流是懒惰的;仅在发起终端操作时才对源数据进行计算,并且仅在需要时消耗源元素。

集合和流虽然有一些表面上的相似之处,但有不同的目标。馆藏主要关注其元素的有效管理和访问。相比之下,流不提供直接访问或操作其元素的方法,而是关注以声明方式描述其源以及将在该源上聚合执行的计算操作。

但是,一旦您在 Stream 上使用了终端操作,Stream 就会被消耗并且不能再次使用。您需要从源中获取新的 Stream 才能执行相同的操作。

例如,让我们获取 aStream<String>并将其引用保存在变量中:

Stream<String> stream  = Stream.of("foo", "bar");
stream.forEach(System.out::println); //invoke terminal operation
stream.forEach(System.out::println); // stream is already consumed

当您尝试再次调用终端操作时,您会得到一个java.lang.IllegalStateException: stream has already been operated upon or closed


推荐阅读