java - 将 Stream 分配给变量:好还是不好?
问题描述
如果我将流分配给变量,例如
final Stream<String> docs = REST_CLIENT.postLS(RestClient.appendSegmentToPath(bucketUrl, "_bulk_get"),
这是一个坏主意吗?因为流需要将数据存储在内存中——就像 Collection 一样。但与集合不同的是,流不指定如何存储数据——作为数组、树或其他
解决方案
流被懒惰地评估,它们不像作为数据持有者的集合。因此,在您的代码中,这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
推荐阅读
- python - Discord.py bot 在 heroku 上运行时不会启动构建
- jmeter - 如何评估 Jmeter Aggregare 报告结果?
- javascript - 如何通过线性渐变将y轴的笔触颜色更改为
- vue.js - 当动态缩放表时(在引导 vue 选项卡部分),一个部分可以缩放,另一个不可以,有人可以向我解释一下吗?
- java - Spring boot - Java 类版本不匹配
- php - 使用 PHP 在 JSON 嵌套数组中处理 JSON 嵌套数组中的项
- c - pwn 只有 realpath(),没有 write()
- react-native - 挂载页面时如何仅调度一次?
- flutter - flutter_web_auth 导航问题。从网页进行身份验证后,重定向不会使用所需的访问令牌返回到应用程序
- flutter - Flutter:弹出导航时不调用构建