调用collect(Collectors.toList())返回可变的ArrayList,保持串行流顺序,支持null元素且结果非null;Java 16+可用stream.toList()获取不可变List。

直接调用 collect(Collectors.toList()) 就能把流中的元素收集到一个 ArrayList 中,这是最常用、最直观的收集方式。
它返回的是 ArrayList,不是 List 接口实例
虽然方法签名返回 List<T>,但实际创建的是 java.util.ArrayList。这意味着你可以安全地向下转型(尽管通常没必要),也意味着它支持随机访问和动态扩容。
- 底层使用
ArrayList::new作为 supplier,ArrayList::add作为 accumulator - 并发流下不保证顺序,但普通串行流能保持原始顺序
- 返回的列表允许
null元素(除非源数据本身不允许)
基本用法:从集合或数组生成流再收集
常见起点是集合、数组或 Stream.of():
list.stream().filter(x -> x > 0).collect(Collectors.toList())Stream.of("a", "b", "c").map(String::toUpperCase).collect(Collectors.toList())Arrays.stream(arr).boxed().collect(Collectors.toList())
注意空流和 null 安全
空流调用 toList() 会返回空的 ArrayList(不是 null),这点很友好;但若流中元素本身为 null,收集过程不会报错(除非后续操作触发 NPE)。
立即学习“Java免费学习笔记(深入)”;
- 不需要额外判空:结果永远是非 null 的
List - 如果业务逻辑要求排除 null,得提前用
filter(Objects::nonNull) - 避免在 collect 前对流做可能抛异常的操作(如 map 中解包 null 对象)
替代方案:toList()(Java 16+)更简洁
Java 16 引入了 Stream.toList(),语义相同但更简短,且返回不可变列表(注意区别):
-
stream.collect(Collectors.toList())→ 可变ArrayList -
stream.toList()→ 不可变List(修改会抛UnsupportedOperationException) - 若需可变列表且用新 API,可显式转成
new ArrayList<>(stream.toList())


















