可使用Stream.collect(Collectors.toCollection())显式指定最终容器实现类,如ArrayList、LinkedList、TreeSet等,通过构造方法引用或lambda创建空集合实例,确保类型可控、行为可定制,且Supplier必须每次返回全新空集合。
可以使用
显式指定最终容器的实现类,比如
、
、
或自定义集合,关键在于传入一个能创建该类型空集合的构造方法引用或 lambda 表达式。
传入构造器引用(最常用)
直接使用目标集合类的无参构造器引用,Collectors 会在收集开始前调用它创建新实例:
→ 返回
→ 返回
→ 返回按自然顺序排序的
→ 返回无序、去重的
示例:
CentOS Stream 9
CentOS Stream 9是基于RHEL 9技术路线的持续交付版本,适合需要贴近RHEL 9生态的软件开发、系统集成和测试环境。它相比传统CentOS Linux更靠近上游开发过程,用户可以更早看到RHEL 9后续小版本中的软件包变化。CentOS Stream 9仍是当前可用的官方版本线之一,适合对稳定性和新功能之间有平衡需求的团队使用。
下载
传入带参数的构造逻辑(如定制 TreeSet)
若需控制集合行为(如指定比较器),不能用简单构造器引用,改用 lambda 创建实例:
(保持插入顺序且去重)
(适合并发读多写少场景)
示例:
与 toList() / toSet() 的本质区别
和
返回的是不可保证具体实现类的集合(JDK9+ 返回不可变集合,JDK8 多为
或
,但不承诺),而
完全由你掌控实例类型和初始化逻辑,适用于以下场景:
需要特定性能特征(如频繁首尾插入选
)
要求可变性(避免 JDK9+
返回不可变列表)
需预设容量(如
)
集成特殊集合(如 Guava 的
或并发集合)
注意事项
所传 Supplier 必须每次返回**全新、空的集合实例**;若复用同一对象,会导致数据污染或并发问题。不要写成
。
另外,
不做去重或排序,这些行为由集合自身决定(如
自动排序,
自动去重),流中元素仍按原始处理顺序传递给集合的
方法。
Stream.collect(Collectors.toCollection())ArrayListLinkedListTreeSettoCollection(ArrayList::new)ArrayListtoCollection(LinkedList::new)LinkedListtoCollection(TreeSet::new)TreeSettoCollection(HashSet::new)HashSetList list = Stream.of("c", "a", "b")
.collect(Collectors.toCollection(ArrayList::new)); // 确保结果是 ArrayList toCollection(() -> new TreeSet<>(Comparator.reverseOrder()))toCollection(() -> new LinkedHashSet<>())toCollection(() -> new CopyOnWriteArrayList<>())Set sortedSet = Stream.of("banana", "apple", "cherry")
.collect(Collectors.toCollection(() -> new TreeSet<>(String.CASE_INSENSITIVE_ORDER))); Collectors.toList()toSet()ArrayListHashSettoCollection()LinkedListtoList()() -> new ArrayList<>(100)ImmutableList.builder()toCollection(() -> myExistingList)toCollection()TreeSetHashSetadd()