java stream api 通过调用 collect() 方法并传入一个 collector 实例来实现结果收集。具体做法是调用 collectors.toxxx() 系列工厂方法获取预定义的收集器,或者使用 collectors.collectingandthen() 进行后处理。该操作会触发流中所有元素的消费,将元素按指定规则聚合为集合、映射或单一值。

如何将流元素收集到 List 中?
将流元素收集到 List 中应使用 Collectors.toList() 或 Collectors.toCollection(ArrayList::new)。前者返回一个不可变列表(取决于实现),后者允许指定具体的 List 实现类。执行时,流中的每个元素会被添加到目标列表中,最终返回包含所有元素的集合对象。

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
List<String> result = Stream.of("A", "B", "C")
.collect(Collectors.toList());
System.out.println(result);
}
}
如何根据条件分组收集 Map?
根据条件分组收集到 Map 中应使用 Collectors.groupingBy()。该方法接受一个分类函数作为参数,流中的每个元素都会经过该函数计算,结果作为 Map 的键,具有相同键的元素会被归入同一个列表中作为值。如果需要对分组后的值进行二次聚合,可以传入第二个 Collector 参数。
立即学习“Java免费学习笔记(深入)”;

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Map<Integer, List<String>> result = Stream.of("apple", "banana", "apricot")
.collect(Collectors.groupingBy(String::length));
System.out.println(result);
}
}
当流中包含 null 元素时 collect 行为如何?
当流中包含 null 元素时,collect() 的行为取决于所使用的 Collector 实现。对于 Collectors.toList(),如果底层实现允许 null,则结果列表中将包含 null;若使用 Collectors.toSet() 且底层集合不允许 null,则会抛出 NullPointerException。在使用自定义 Collector 时,需确保累加器能正确处理 null 输入,否则可能引发异常。


















