如果我将流分配给一个变量,例如
final Stream<String> docs = REST_CLIENT.postLS(Rest.appendSegmentToPath(bucketUrl, "_bulk_get"),
这会是个坏主意吗?因为流需要将数据存储在内存中-就像 Collection 一样。但与集合不同,流没有指定如何存储数据-作为数组、树或其他
因此,在您的代码中,Stream<String>
是String
数据的来源,当您执行流操作并具有终端操作时,该流管道将被评估并被称为消耗,直到那时没有内存用于存储来自流源的数据。
这是根据Java docs:
流是惰性的;只有在启动终端操作时才执行对源数据的计算,并且仅根据需要使用源元素。
相反,流不提供直接访问或操作其元素的方法,而是以声明方式描述其源和将在该源上聚合执行的计算操作。
但是一旦你在 Stream 上使用了一个终端操作,Stream 就会被消耗并且不能再次使用。
例如,让我们得到一个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
当您尝试再次调用终端操作时,您会得到一个java.lang.IllegalStateException: stream has already been operated upon or closed
您不能一次又一次地处理流,因为流应该只操作一次(调用中间或终端流操作)
final Stream<String> docs = REST_CLIENT.postLS(Rest.appendSegmentToPath(bucketUrl, "_bulk_get"),
In here
您可以使用供应商一次又一次地使用流
Supplier 是 java.util.function 包中在 Java8 中引入的内置功能接口。供应商可以在没有输入但期望输出的所有上下文中使用。由于 Supplier 是功能接口
Supplier<Stream<String>> docs = REST_CLIENT.postLS(Rest.appendSegmentToPath(bucketUrl, "_bulk_get"),
docs.get()// you can perform operation after calling get().map().filter()
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(58条)