2026/2/24 23:18:40
网站建设
项目流程
网站推广最有效的方法,如何给网站划分栏目,重庆建设工程信息网官网安全监督,网站设计书300. Java Stream API - 收集 Stream 元素到集合或数组#xff08;Java Stream 收集器详解#xff09;
Java 的 Stream API 提供了多种方式来将流中的元素收集到集合中#xff0c;比如 List、Set、数组等。你在上一节已经见识过其中的一两个例子#xff0c;本节我们来深入…300. Java Stream API - 收集 Stream 元素到集合或数组Java Stream 收集器详解Java 的 Stream API 提供了多种方式来将流中的元素收集到集合中比如 List、Set、数组等。你在上一节已经见识过其中的一两个例子本节我们来深入挖掘各种实用模式及其适用场景。 在选择收集方式前你应先思考几个关键问题 是否需要一个不可变unmodifiable的集合 是否需要一个具体的集合类型如ArrayList、LinkedList或自定义实现 是否能预估元素数量这将影响性能优化 是否需要与第三方库的集合实现兼容这些因素会影响你最终的收集方式选择。接下来我们逐一介绍各种场景下的典型收集方式。 1. 收集到可变ArrayList默认方式这是最常用也最简单的方式StreamStringstringsStream.of(one,two,three,four);ListStringresultstrings.filter(s-s.length()3).map(String::toUpperCase).collect(Collectors.toList());System.out.println(result result); 输出result[ONE,TWO] 特点返回一个普通的ArrayList简洁 ✅可变 ✅性能中等 ⚠️当元素数量大时可能触发内部数组扩容 2. 自定义集合类型或预设容量toCollection当你想使用其他集合类型如LinkedList或者你知道将要收集多少元素可优化容量可使用Collectors.toCollection(...)StreamIntegerintsIntStream.range(0,10_000).boxed();ListStringresultints.map(String::valueOf).collect(Collectors.toCollection(()-newArrayList(10_000)));System.out.println(# result size result.size()); 好处避免ArrayList多次扩容可替换为LinkedList::new、CopyOnWriteArrayList::new等工厂方法 3. 收集为不可变 ListJava 10✅ 使用Collectors.toUnmodifiableList()StreamStringstringsStream.of(one,two,three,four);ListStringresultstrings.filter(s-s.length()3).map(String::toUpperCase).collect(Collectors.toUnmodifiableList());System.out.println(result result); 输出result[ONE,TWO]⚠️ 尝试修改result.add(...)会抛出UnsupportedOperationException 4. 更高效的不可变 ListJava 16✅ 使用新方法.toList()StreamStringstringsStream.of(one,two,three,four);ListStringresultstrings.filter(s-s.length()3).map(String::toUpperCase).toList();System.out.println(result result); 输出result[ONE,TWO]⚙️ 为什么更高效.collect(Collectors.toUnmodifiableList())的底层实现是收集到一个ArrayList再封装为不可变集合多了一步.toList()则更聪明如果能预估流的长度它会一次性分配数组空间避免扩容与拷贝JDK 16优化 5. 收集到数组使用toArray❌ 简单版类型擦除Object[]resultStream.of(a,b,c).toArray();不推荐返回Object[]类型丢失。✅ 推荐写法保留数组类型String[]resultStream.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[]::newsize-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不推荐类型擦除