天牛须优化算法+GRNN:多特征预测模型超参数自动调优实战
2026/10/13 7:59:55
Java 的 Stream API 提供了多种方式来将流中的元素收集到集合中,比如 List、Set、数组等。你在上一节已经见识过其中的一两个例子,本节我们来深入挖掘各种实用模式及其适用场景。
ArrayList、LinkedList或自定义实现)?这些因素会影响你最终的收集方式选择。接下来我们逐一介绍各种场景下的典型收集方式。
ArrayList(默认方式)这是最常用也最简单的方式:
Stream<String>strings=Stream.of("one","two","three","four");List<String>result=strings.filter(s->s.length()==3).map(String::toUpperCase).collect(Collectors.toList());System.out.println("result = "+result);🧾 输出:
result=[ONE,TWO]📌 特点:
ArrayListtoCollection)当你:
LinkedList)可使用Collectors.toCollection(...):
Stream<Integer>ints=IntStream.range(0,10_000).boxed();List<String>result=ints.map(String::valueOf).collect(Collectors.toCollection(()->newArrayList<>(10_000)));System.out.println("# result size = "+result.size());🧠 好处:
ArrayList多次扩容LinkedList::new、CopyOnWriteArrayList::new等工厂方法Collectors.toUnmodifiableList()Stream<String>strings=Stream.of("one","two","three","four");List<String>result=strings.filter(s->s.length()==3).map(String::toUpperCase).collect(Collectors.toUnmodifiableList());System.out.println("result = "+result);📌 输出:
result=[ONE,TWO]⚠️ 尝试修改result.add(...)会抛出UnsupportedOperationException
.toList()Stream<String>strings=Stream.of("one","two","three","four");List<String>result=strings.filter(s->s.length()==3).map(String::toUpperCase).toList();System.out.println("result = "+result);📌 输出:
result=[ONE,TWO].collect(Collectors.toUnmodifiableList())的底层实现是:ArrayList.toList()则更聪明:如果能预估流的长度,它会一次性分配数组空间,避免扩容与拷贝(JDK 16优化)toArray)Object[]result=Stream.of("a","b","c").toArray();Object[],类型丢失。String[]result=Stream.of("one","two","three","four").filter(s->s.length()==3).map(String::toUpperCase).toArray(String[]::new);System.out.println(Arrays.toString(result));📌 输出:
[ONE,TWO]🧠 背后的语法糖:
String[]::new==size->newString[size]| 模式 | 返回类型 | 可变性 | Java 版本 | 适用场景说明 |
|---|---|---|---|---|
collect(Collectors.toList()) | ArrayList | ✅ 可变 | Java 8+ | 默认收集方式,简单好用 |
collect(toCollection(...)) | 任意集合类型 | ✅ 可变 | Java 8+ | 自定义集合或设置初始容量 |
collect(toUnmodifiableList()) | ImmutableList | ❌ 不可变 | Java 10+ | 需要只读集合,防止误修改 |
stream.toList() | ImmutableList | ❌ 不可变 | Java 16+ | 更高效的不可变收集,推荐 |
toArray(String[]::new) | 数组 | ✅ 可变 | Java 8+ | 需要收集成固定类型数组 |
toArray() | Object[] | ✅ 可变 | Java 8+ | 不推荐,类型擦除 |