在API 参考中是这样写的:
流是支持顺序和并行聚合操作的元素序列
然后,
在此示例中,小部件是一个集合。我们通过 Collection.stream() 创建一个 Widget 对象流,对其进行过滤以生成仅包含红色小部件的流,然后将其转换为表示每个红色小部件重量的 int 值流。然后将该流相加以产生总重量。
再次来自 Java 教程
流是一系列元素。与集合不同,它不是存储元素的数据结构
那么,流是否包含元素?
在API 参考中是这样写的:
流是支持顺序和并行聚合操作的元素序列
然后,
在此示例中,小部件是一个集合。我们通过 Collection.stream() 创建一个 Widget 对象流,对其进行过滤以生成仅包含红色小部件的流,然后将其转换为表示每个红色小部件重量的 int 值流。然后将该流相加以产生总重量。
再次来自 Java 教程
流是一系列元素。与集合不同,它不是存储元素的数据结构
那么,流是否包含元素?
流定义了数据的逻辑组织。就存储在内存中的数据(物理组织)而言,流可能“包含”元素,也可能不“包含”元素。它们可能会被延迟计算,允许无限大小。
集合还定义了数据的逻辑组织。集合也可能是惰性计算的:您可以编写一个List<T>
包装 a 的实现Function<Integer, T>
来计算List.get(int)
. 这样的清单将禁止突变。(在使用单链表作为原始数据结构的函数式语言中,数组有时表示为函数——这种List
-from-function 模式可以看作是逆运算。)类似地,aFunction<K, V>
可以看作是不可变的Map<K, V>
。Infinite List
s 有点笨拙,因为int
它的范围有限,因此get(int)
只能访问列表的有限范围,但它们是可能的。
因此,数据的逻辑组织(列表、映射、流)大多与物理布局正交(存储在数组或树中,或从函数中延迟计算)。这就是集合和流抽象的意义所在。