Java 8 stream Collectors 操作

Collectors

Collectors 是 Java 8 加入的操作类,位于 java.util.stream 包下。它会根据不同的策略将元素收集归纳起来,比如最简单常用的是将元素装入Map、Set、List 等可变容器中。特别对于 Java 8 Stream Api 来说非常有用。它提供了collect() 方法来对 Stream 流进行终结操作派生出基于各种策略的结果集。

1
2
3
4
5
6
List<String> language = new ArrayList<>();
language.add("Java");
language.add("PHP");
language.add("Python");
language.add("Go");
language.add("C#");

Java 8 中 Collectors 的方法

Collectors 提供了一系列的静态方法供我们使用,通常情况我们静态导入即可使用。

1
2
3
4
5
Collectors.toList();
Collectors.toMap();
Collectors.toSet();
Collectors.toCollection();
Collectors.toConcurrentMap();

joining

将元素以某种规则连接起来。该方法有两种种重载 joining(CharSequence delimiter) 和 joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix)

1
2
3
4
5
6
7
8
//   输出 JavaPHPPythonGoC#
language.stream().collect(Collectors.joining());

// 输出 Java,PHP,Python,Go,C#
language.stream().collect(Collectors.joining("," ));

// 输出 [Java,PHP,Python,Go,C#]
language.stream().collect(Collectors.joining(",", "[", "]"));

collectingAndThen

该方法先执行了一个归纳操作,然后再对归纳的结果进行 Function 函数处理输出一个新的结果。

1
2
//   先进行了joining操作再转为大写 输出为 JAVA,PHP,PYTHON,GO,C#
language.stream().collect(Collectors.collectingAndThen(Collectors.joining(","), String::toUpperCase));

groupingBy

按照条件对元素进行分组

1
2
// 按照字符串长度进行分组,符合条件的元素将组成一个 List 映射到以条件长度为key 的 Map<Integer, List<String>> 中
language.stream().collect(Collectors.groupingBy(String::length))

counting

归纳元素的的数量

1
2
// 输出 5
language.stream().collect(Collectors.counting())

maxBy/minBy

这两个方法分别提供了查找大小元素的操作,它们基于比较器接口 Comparator 来比较 ,返回的是一个 Optional 对象。

1
2
// 输出 Go
Optional<String> min = language.stream().collect(Collectors.minBy(Comparator.comparingInt(String::length)));

summingInt/Double/Long

用来做累加计算。计算元素某个属性的总和,类似 Mysql 的 sum 函数

1
2
// 总长度17
language.stream().collect(Collectors.summingInt(l -> l.length()));

summarizingInt/Double/Long

如果我们总数,总和,最大最小值这些都要呢,summarizingInt、summarizingDouble、summarizingLong这三个方法通过对元素某个属性的提取,会返回对元素该属性的统计数据对象,分别对应 IntSummaryStatistics、DoubleSummaryStatistics、LongSummaryStatistics。

1
2
3
DoubleSummaryStatistics doubleSummaryStatistics = language.stream().collect(Collectors.summarizingDouble(String::length));
// DoubleSummaryStatistics{count=5, sum=17.000000, min=2.000000, average=3.400000, max=6.000000}
System.out.println(doubleSummaryStatistics.toString());

结果 DoubleSummaryStatistics 中包含了 总数,总和,最小值,最大值,平均值 五个值


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!