如果我将流分配给变量,例如
final Stream<String> docs = REST_CLIENT.postLS(RestClient.appendSegmentToPath(bucketUrl, "_bulk_get"),
Run Code Online (Sandbox Code Playgroud)
这是个坏主意吗?因为流将需要将数据存储在内存中-就像Collection一样。但是与集合不同,流没有指定如何存储数据-作为数组,树或其他形式
流是惰性计算的,它们不像充当数据持有者的集合。因此,在您的代码中,它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
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |