流操作: 无状态 vs. 有状态

你已经看到了很多的流操作。最初的陈述可以使他们看起来是万能的;一切都是正常的, 当您使用 parallelStream 而不是stream从集合中获取流时, 您可以免费获得并行性。

当然, 对于许多应用程序来说, 情况就是这样, 正如您在前面的示例中所看到的那样。你可以把一盘菜的列表变成一条小溪, filter选择各种菜肴的某种类型, 然后把由此产生的溪流中的卡路里数加起来, 然后减少到产生总热量的菜单。您甚至可以并行进行此类流计算。但这些操作有不同的特点。有什么内部状态, 他们需要运行的问题。

像 map 和filter这样的操作从输入流中得到每个元素, 并在输出流中产生零个或一个结果。因此, 这些操作通常是无状态的: 它们没有内部状态 (假设用户提供的 lambda 或方法引用没有内部可变状态)。

但是像reduce、sum和max 这样的操作需要有内部状态来累积结果。在这种情况下, 内部状态是小的。在我们的例子中, 它包括了一个 int 或double。无论正在处理的流中有多少元素, 内部状态都是有界大小的。

相比之下, 某些操作 (如sorted或distinct) 首先看起来像filter或map–所有这些都采用流并生成另一个流 (中间操作), 但有一个关键的区别。从流中排序和删除重复项都需要了解以前的历史记录才能完成其工作。例如, 排序要求在将单个项添加到输出流之前对所有元素进行缓冲。操作的存储要求是无限制的。如果数据流是大的或无限的, 这可能是问题。(什么应该逆转所有质数的流?它应该返回最大的质数, 数学告诉我们不存在。我们称这些操作为有状态的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生活中的思索

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值