其他答案已经清楚地解释了
Collection.stream
和
Stream.of
之间的区别,何时使用其中一个,应用了哪些设计模式等。@Holger甚至进一步展示了
Stream.Builder
的使用示例,我认为这是高度被低估的。
在这里,我想通过展示混合使用
Stream.of
和
Collection.stream
方法来补充其他答案。我希望这个示例足够清晰,以表明即使
Stream.of
和
Collection.stream
是完全不同的方法,它们也可以一起使用来实现更复杂的需求。
假设你有N个列表,它们都包含相同类型的元素:
List<A> list1 = ...;
List<A> list2 = ...;
...
List<A> listN = ...;
您想创建一个包含所有列表元素的流。
您可以创建一个新的空列表,并将所有列表的元素添加到该新列表中:
int newListSize = list1.size() + list2.size() + ... + listN.size();
List<A> newList = new ArrayList<>(newListSize);
newList.addAll(list1);
newList.addAll(list2);
...
newList.addAll(listN);
然后,您可以在此列表上调用
stream()
并完成操作:
Stream<A> stream = newList.stream();
然而,您将会创建一个中间的无意义列表,其唯一目的是流式传输原始的list1
、list2
、...、listN
列表元素。
更好的方法是使用Stream.of
:
Stream<A> stream = Stream.of(list1, list2, ..., listN)
.flatMap(Collection::stream);
首先,通过枚举每个列表来创建一个列表流,然后使用 Stream.flatMap
操作将此列表流展开为所有列表元素的流。因此,在展开原始流时调用了 Collection.stream
。