一. 什么是Collectors?

Java 8 API添加了一个新的抽象称为流Stream,我们借助Stream API可以很方便的操作流对象。

Stream中有两个方法collect和collectingAndThen,可以借助Collectors收集器类对流中的数据进行聚合操作,例如将元素累积到集合中,并根据各种标准对元素进行汇总,分类等操作。

二. 举个例子?

//获取String集合
List<String> strings = Arrays.asList("ab", "", "bc", "cd", "abcd","", "jkl");
//通过stream操作集合
List<String> stringList = strings.stream()
//为集合中的每一个元素拼接“???”
.map(s -> s += "???")
//返回集合
.collect(Collectors.toList());

如代码所示,我们可以很方便的通过Collectors类对被处理的流数据进行聚合操作,包括并不仅限与将处理过的流转换成集合

三. 如何使用Collectors?

1. Collectors类中提供的方法

总结一下,就是以下几类方法:

1.1 转换成集合:toList(),toSet(),toMap(),toCollection()

1.2 将集合拆分拼接成字符串:joining()

1.3 求最大值、最小值、求和、平均值 :maxBy(),minBy(),summingInt(),averagingDouble()

1.4 对集合分组:groupingBy(),partitioningBy()

1.5 对数据进行映射:mapping()

2. Collectors类方法源码

public final class Collectors {

    // 转换成集合
public static <T> Collector<T, ?, List<T>> toList();
public static <T> Collector<T, ?, Set<T>> toSet();
public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper);
public static <T, C extends Collection<T>> Collector<T, ?, C> toCollection(Supplier<C> collectionFactory); // 拼接字符串,有多个重载方法
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter);
public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix);
// 最大值、最小值、求和、平均值
public static <T> Collector<T, ?, Optional<T>> maxBy(Comparator<? super T> comparator);
public static <T> Collector<T, ?, Optional<T>> minBy(Comparator<? super T> comparator);
public static <T> Collector<T, ?, Integer> summingInt(ToIntFunction<? super T> mapper);
public static <T> Collector<T, ?, Double> averagingDouble(ToDoubleFunction<? super T> mapper); // 分组:可以分成true和false两组,也可以根据字段分成多组
public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier);
// 只能分成true和false两组
public static <T> Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate); // 映射
public static <T, U, A, R> Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
Collector<? super U, A, R> downstream); public static <T, U> Collector<T, ?, U> reducing(U identity,
Function<? super T, ? extends U> mapper,
BinaryOperator<U> op);
}

四. 实例

//接下来的示例代码基于此集合
List<String> strings = Arrays.asList("ab", "s", "bc", "cd", "abcd","sd", "jkl");

1. 将流数据转换成集合

//转换成list集合
List<String> stringList = strings.stream().collect(Collectors.toList()); //转换成Set集合
Set<String> stringSet = strings.stream().collect(Collectors.toSet()); //转换成Map集合
Map<String,Object> stringObjectMap = strings.stream()
.collect(Collectors.toMap(k -> k, v -> v )); System.out.println(stringList);
System.out.println(stringSet);
System.out.println(stringObjectMap); //=================打印结果=================
[ab, s, bc, cd, abcd, sd, jkl]
[ab, bc, cd, sd, s, jkl, abcd]
{sd=sd, cd=cd, bc=bc, ab=ab, s=s, jkl=jkl, abcd=abcd}

2. 将集合拆分拼接成字符串

//joining
String str1 = strings.stream()
.collect(Collectors.joining("--")); //collectingAndThen
String str2 = strings.stream()
.collect(Collectors.collectingAndThen(
//在第一个joining操作的结果基础上再进行一次操作
Collectors.joining("--"), s1 -> s1 += ",then"
)); System.out.println(str1);
System.out.println(str2); //=================打印结果=================
ab--s--bc--cd--abcd--sd--jkl
ab--s--bc--cd--abcd--sd--jkl,then

3. 求最大值、最小值、求和、平均值

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

//最大值
Integer maxValue = list.stream().collect(Collectors.collectingAndThen(
//maxBy需要Comparator.comparingInt来确定排序规则
Collectors.maxBy(Comparator.comparingInt(a -> a)), Optional::get
));
//最小值
Integer minValue = list.stream().collect(Collectors.collectingAndThen(
//minBy需要Comparator.comparingInt来确定排序规则
Collectors.minBy(Comparator.comparingInt(a -> a)), Optional::get
));
//求和
Integer sumValue = list.stream().collect(Collectors.summingInt(i -> i));
//平均值
Double avgValue = list.stream().collect(Collectors.averagingDouble(i -> i)); System.out.println("列表中最大的数 : " + maxValue);
System.out.println("列表中最小的数 : " + minValue);
System.out.println("所有数之和 : " + sumValue);
System.out.println("平均数 : " + avgValue); //=================打印结果=================
列表中最大的数 : 5
列表中最小的数 : 1
所有数之和 : 15
平均数 : 3.0

虽然这样也可以,但是明显IntSummaryStatistics要更灵活点

4. 对集合分组

Map<Integer, List<String>> map = strings.stream()
//根据字符串长度分组(同理,对对象可以通过某个属性分组)
.collect(Collectors.groupingBy(String::length)); Map<Boolean, List<String>> map2 = strings.stream()
//根据字符串是否大于2分组
.collect(Collectors.groupingBy(s -> s.length() > 2)); System.out.println(map);
System.out.println(map2); //=================打印结果=================
{1=[s], 2=[ab, bc, cd, sd], 3=[jkl], 4=[abcd]}
{false=[ab, s, bc, cd, sd], true=[abcd, jkl]}

5.对数据进行映射

String str = strings.stream().collect(Collectors.mapping(
//先对集合中的每一个元素进行映射操作
s -> s += ",mapping",
//再对映射的结果使用Collectors操作
Collectors.collectingAndThen(Collectors.joining(";"), s -> s += "=====then" )
)); System.out.println(str); //=================打印结果=================
ab,mapping;s,mapping;bc,mapping;cd,mapping;abcd,mapping;sd,mapping;jkl,mapping=====then

JDK1.8新特性(二):Collectors收集器类的更多相关文章

  1. JDK1.5新特性(二)……Static Import

    援引 Static Import - This facility lets you avoid qualifying static members with class names without t ...

  2. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

  3. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  4. JDK1.8新特性——Stream API

    JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...

  5. Java8新特性之Collectors

    参考:Java8新特性之Collectors 在第二天,你已经学习了Stream API能够让你以声明式的方式帮助你处理集合.我们看到collect是一个将管道流的结果集到一个list中的结束操作.c ...

  6. JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)

    5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...

  7. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  8. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  9. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

随机推荐

  1. 在Linux下使用rm -rf /*后会怎样?

    每个工作过的码农,也许不知道分布式,也许不知道高并发,但想必都知道这句鼎鼎大名的代码.本人对此也是比较好奇的,不妨用虚拟机试试看 首先是普通角色: 普通角色把拥有权限的文件全都删掉了后,其他文件的提示 ...

  2. caps lock 映射成 esc,右Ctrl映射右移

    xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape' xmodmap -e 'clear Lock' -e 'keycode 105= Right'

  3. HearthBuddy 日志模块

    // Triton.Common.LogUtilities.CustomLogger // Token: 0x04000BD8 RID: 3032 private Level level_0 = Le ...

  4. Matlab获取一个文件夹下所有文件名

    Matlab获取一个文件夹下所有文件名: fileFolder=fullfile('D:\MATLAB\bin\trc'); dirOutput=dir(fullfile(fileFolder,'*. ...

  5. Qt编写自定义控件14-环形进度条

    前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...

  6. CentOS7出现Unit iptables.service could not be found

    CentOS7默认的防火墙不是iptables,而是firewalle. 出现此情况可能是iptables防火墙未安装. #停止firewalld服务 systemctl stop firewalld ...

  7. R语言与概率统计(三) 多元统计分析(中)

    模型修正 #但是,回归分析通常很难一步到位,需要不断修正模型 ###############################6.9通过牙膏销量模型学习模型修正 toothpaste<-data. ...

  8. Kettle 排序记录的使用(Sort rows)

    排序行的步骤根据您指定的字段和它们是否应该按升序或降序排序当行数超过指定的排序大小(默认为100万行)时候,kettle必须使用临时文件排序行.步骤名称:名称在整个转换中应该是唯一的排序目录:默认当前 ...

  9. 使用python装饰器计算函数运行时间的实例

    使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是 ...

  10. Pycharm 编辑器快捷键

    必备技能:IDEA一定要懂的32条快捷键 这些IntelliJ IDEA键盘快捷键可以让你专注于编写代码,让你的双手在键盘上起舞. 1,搜索文件名: ↑   Shift 快速连续按两下 2,显示便捷提 ...