赞
踩
你已经看到了很多的流操作。最初的陈述可以使他们看起来是万能的;一切都是正常的, 当您使用 parallelStream 而不是stream从集合中获取流时, 您可以免费获得并行性。
当然, 对于许多应用程序来说, 情况就是这样, 正如您在前面的示例中所看到的那样。你可以把一盘菜的列表变成一条小溪, filter选择各种菜肴的某种类型, 然后把由此产生的溪流中的卡路里数加起来, 然后减少到产生总热量的菜单。您甚至可以并行进行此类流计算。但这些操作有不同的特点。有什么内部状态, 他们需要运行的问题。
像 map 和filter这样的操作从输入流中得到每个元素, 并在输出流中产生零个或一个结果。因此, 这些操作通常是无状态的: 它们没有内部状态 (假设用户提供的 lambda 或方法引用没有内部可变状态)。
但是像reduce、sum和max 这样的操作需要有内部状态来累积结果。在这种情况下, 内部状态是小的。在我们的例子中, 它包括了一个 int 或double。无论正在处理的流中有多少元素, 内部状态都是有界大小的。
相比之下, 某些操作 (如sorted或distinct) 首先看起来像filter或map–所有这些都采用流并生成另一个流 (中间操作), 但有一个关键的区别。从流中排序和删除重复项都需要了解以前的历史记录才能完成其工作。例如, 排序要求在将单个项添加到输出流之前对所有元素进行缓冲。操作的存储要求是无限制的。如果数据流是大的或无限的, 这可能是问题。(什么应该逆转所有质数的流?它应该返回最大的质数, 数学告诉我们不存在。我们称这些操作为有状态的操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。