跳至主要內容

04. Collectors

LiuSongLing大约 2 分钟javajavastream

在Java 8中,Collectors是一个用于聚合数据的工具,可以与Streams API结合使用。

通过Collectors,我们可以将流中的元素收集到集合中、拼接字符串、统计元素等。

1. Collectors的基本用法

Collectors类提供了多种静态方法,允许开发者方便地将流中的元素汇聚成各种数据结构,最常见的是List、Set或者Map。

示例:收集流中的元素到List

List<String> list = Stream.of("a""b""c").collect(Collectors.toList());

2. 常用的Collectors方法

  • toList():将流的元素收集到List中。
  • toSet():将流的元素收集到Set中。
  • toMap():将流的元素收集到Map中。

示例:收集流中的元素到Map

Map<IntegerString> map = Stream.of("a""b""c")
    .collect(Collectors.toMap(String::lengthFunction.identity()));

3. 聚合操作

Collectors还支持各种聚合操作,如计数、求和等。

  • counting():统计流中的元素数量。
  • summarizingInt():统计整数类型元素的汇总信息(总数、最小值、最大值、平均值等)。

示例:元素计数

long count = Stream.of("a""b""a")
    .collect(Collectors.counting());

4. 分组和分区

  • groupingBy():根据某个属性对元素进行分组。
  • partitioningBy():将流的元素划分成两个集合,基于给定的条件。

示例:按字符串长度分组

Map<IntegerList<String>> groupedByLength = Stream.of("a""bb""ccc")
    .collect(Collectors.groupingBy(String::length));

示例:按条件分区

Map<BooleanList<String>> partitioned = Stream.of("a""bb""ccc")
    .collect(Collectors.partitioningBy(s -> s.length() > 1));

5. 自定义收集器

如果内置的收集器无法满足需求,可以自定义收集器。要实现一个自定义的收集器,需要实现Collector接口。

示例:自定义收集器

Collector<StringStringBuilderString> customCollector =
    Collector.of(StringBuilder::newStringBuilder::appendStringBuilder::appendStringBuilder::toString);

总结

Collectors是Java 8的强大特性,使得数据聚合操作变得简单而高效。

通过结合Streams API,我们可以用更加声明式的风格处理数据,提高代码的可读性和可维护性。