当前位置:首页 > Java > 正文

Java流收集详解(Stream API中Collectors的完整使用指南)

在Java 8引入的Stream API中,collect() 方法是一个非常强大且常用的终端操作。它允许我们将流中的元素“收集”成一个集合、字符串、Map,甚至自定义的数据结构。掌握 Java流收集 技术,是高效处理集合数据的关键一步。

Java流收集详解(Stream API中Collectors的完整使用指南) Java流收集 Stream API收集器 Java Collectors用法 Java流式处理教程 第1张

什么是 collect() 方法?

collect()Stream 接口中的一个终端操作,用于将流中的元素累积到一个可变的结果容器中(如 List、Set、String 等)。它接收一个 Collector 类型的参数,而 Java 提供了 Collectors 工具类,其中包含大量预定义的收集器。

常用 Collectors 示例

1. 收集为 List 或 Set

最基础的用法是将流转换为 ListSet

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 收集为 ListList<String> filteredList = names.stream()    .filter(name -> name.startsWith("A"))    .collect(Collectors.toList());// 收集为 SetSet<String> nameSet = names.stream()    .collect(Collectors.toSet());

2. 拼接字符串:joining()

使用 Collectors.joining() 可以轻松将字符串流拼接成一个字符串:

String result = names.stream()    .filter(name -> name.length() > 3)    .collect(Collectors.joining(", "));// 输出: Alice, Charlie

3. 分组:groupingBy()

按某个条件对元素进行分组,结果是一个 Map

List<Person> people = Arrays.asList(    new Person("Alice", 25),    new Person("Bob", 30),    new Person("Charlie", 25));Map<Integer, List<Person>> groupedByAge = people.stream()    .collect(Collectors.groupingBy(Person::getAge));// 结果: {25=[Alice, Charlie], 30=[Bob]}

4. 分区:partitioningBy()

根据布尔条件将流分为两部分(true 和 false):

Map<Boolean, List<Person>> partitioned = people.stream()    .collect(Collectors.partitioningBy(p -> p.getAge() >= 30));// true: [Bob], false: [Alice, Charlie]

自定义 Collector

虽然 Collectors 提供了丰富的内置方法,但你也可以通过实现 Collector 接口创建自己的收集逻辑。不过对于初学者,建议先熟练掌握内置收集器。

总结

通过本教程,你应该已经掌握了 Java流收集 的基本用法。无论是简单的集合转换,还是复杂的分组、分区操作,collect() 配合 Collectors 都能让你的代码更简洁、更函数式。

记住这些核心知识点:

  • toList()toSet():快速转集合
  • joining():字符串拼接利器
  • groupingBy():按条件分组
  • partitioningBy():按布尔值分区

希望这篇 Java流式处理教程 能帮助你更好地理解和使用 Stream API收集器