将Stream分配给变量:可以吗?

Dee*_*eep 3 java java-stream

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

final Stream<String> docs = REST_CLIENT.postLS(RestClient.appendSegmentToPath(bucketUrl, "_bulk_get"),
Run Code Online (Sandbox Code Playgroud)

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

Ful*_*Guy 5

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

这是根据Java文档

流是懒惰的;仅在启动终端操作时才对源数据进行计算,并且仅在需要时才使用源元素。

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

但是,一旦在Stream上使用了终端操作,则Stream将被消耗并且无法再次使用。您需要从源中获取一个新的Stream来执行相同的操作。

例如,让a获取Stream<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
Run Code Online (Sandbox Code Playgroud)

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