Collector是专门用来作为Stream的collect方法的参数的;而Collectors是作为生产具体Collector的工具类。

Collectors是一个工具类,是JDK预实现Collector的工具类,它内部提供了多种Collector,我们可以直接拿来使用,非常方便。

具体用法

public class Collectors_example {

    public static void main(String[] args) {
List<Apple> appleList = new ArrayList<>();
appleList.add(new Apple("red", 170));
appleList.add(new Apple("green", 150));
appleList.add(null);
appleList.add(new Apple("yellow", 170));
appleList.add(new Apple("green", 100));
appleList.add(new Apple("red", 170)); //joining: 拼接
String join = appleList.stream().map(x -> x.getColor()).collect(Collectors.joining());
String join1 = appleList.stream().map(x -> x.getColor()).collect(Collectors.joining("-"));
String join2 = appleList.stream().map(x -> x.getColor()).collect(Collectors.joining("-", "前缀", "后缀"));
System.out.println(join2); //toCollection、toList与toSet
ArrayList<Integer> arrayList = appleList.stream().map(x -> x.getWeight()).collect(Collectors.toCollection(ArrayList::new));
List<Integer> arrayList1 = appleList.stream().map(x -> x.getWeight()).collect(Collectors.toList());
Set<Integer> hashSet = appleList.stream().map(x -> x.getWeight()).collect(Collectors.toSet()); System.out.println("----------------------------------");
//toMap与toConcurrentMap: 键不能重复!!! toConcurrentMap同toMap
Map<String, Integer> map4 = appleList.stream().collect(Collectors.toMap(Apple::getColor, Apple::getWeight));
Map<Integer, Integer> map5 = appleList.stream().collect(Collectors.toMap(Apple::getWeight, x -> 1, Integer::sum));
Hashtable<Integer, Integer> hashtable = appleList.stream().collect(Collectors.toMap(Apple::getWeight, x -> 1, Integer::sum, Hashtable::new));
System.out.println(map5);
System.out.println(hashtable); //reducing: 对输入元素执行汇聚操作
Apple apple = appleList.stream().collect(Collectors.reducing(BinaryOperator.maxBy(Comparator.comparingInt(Apple::getWeight)))).orElse(null);
Integer inte = appleList.stream().map(x -> x.getWeight()).collect(Collectors.reducing(10000, Integer::sum));
Integer inte1 = appleList.stream().collect(Collectors.reducing(0, Apple::getWeight, Integer::sum));
System.out.println(inte1); /******************求值: list中如果存在空元素会抛空指针异常!!******************/
//averaging: 平均值
//averagingInt/averagingLong/averagingDouble
Double collect = appleList.stream().collect(Collectors.averagingDouble(Apple::getWeight));
System.out.println(collect); //counting: 统计个数
Long count = appleList.stream().collect(Collectors.counting());
Long emptyCount = Stream.empty().collect(Collectors.counting());
//Stream.count()方法的返回值是long型,counting()方法返回值是Collector类型
long streamCount = appleList.stream().count();
System.out.println(count);
System.out.println(emptyCount); //maxBy、minBy: 最大最小值
appleList.stream().collect(Collectors.maxBy(Comparator.comparingInt(Apple::getWeight))).ifPresent(System.out::println);
appleList.stream().collect(Collectors.minBy(Comparator.comparingInt(Apple::getWeight))).ifPresent(System.out::println); //summing、summarizing: 求和
Integer sum1 = appleList.stream().collect(Collectors.summingInt(Apple::getWeight));
IntSummaryStatistics iss = appleList.stream().collect(Collectors.summarizingInt(Apple::getWeight));
System.out.println(iss.getMax());
System.out.println(iss.getMin());
System.out.println(iss.getCount());
System.out.println(iss.getSum());
System.out.println(iss.getAverage()); /******************分组******************/
//groupingBy: 分组
Map<String, List<Apple>> map = appleList.stream().collect(Collectors.groupingBy(Apple::getColor));
Map<String, Long> longMap = appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.counting()));
TreeMap<String, Long> treeMap = appleList.stream().collect(Collectors.groupingBy(Apple::getColor, TreeMap::new, Collectors.counting()));
longMap.forEach((k, v) -> {
System.out.println(k + ":" + v);
}); //groupingByConcurrent: 操作同groupingBy; 元素整理成ConcurrentMap(线程安全)
ConcurrentMap<String, List<Apple>> map1 = appleList.stream().collect(Collectors.groupingByConcurrent(Apple::getColor)); //partitioningBy: 分区;例:大于150的一个组,小于150的一个组
Map<Boolean, List<Apple>> map2 = appleList.stream().collect(Collectors.partitioningBy(x -> x.getWeight() > 150));
Map<Boolean, Long> map3 = appleList.stream().collect(Collectors.partitioningBy(x -> x.getWeight() > 150, Collectors.counting()));
map3.forEach((k, v) -> {
System.out.println(k + ":" + v);
}); //collectingAndThen: 收集后操作
String avg = appleList.stream().collect(Collectors.collectingAndThen(Collectors.averagingInt(Apple::getWeight), item -> "average weight is " + item));
System.out.println(avg); //mapping: 在调用mapper之后,将调用结果的返回值作为downstream的输入元素,再调用downstream
String collect1 = appleList.stream().collect(Collectors.mapping(Apple::getColor, Collectors.joining("-")));
System.out.println(collect1); } /******************自定义******************/
public static <T> Collector<T, Set<T>, Set<T>> toImmutableSet() {
return Collector.of(HashSet::new, Set::add, (left, right) -> {
left.addAll(right);
return left;
}, t -> t, Collector.Characteristics.IDENTITY_FINISH);
} public static <T, A extends Set<T>> Collector<T, A, Set<T>> toImmutableSet(Supplier<A> supplier) {
return Collector.of(
supplier,
Set::add, (left, right) -> {
left.addAll(right);
return left;
}, Collections::unmodifiableSet);
} }

Collectors工具类的更多相关文章

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

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

  2. JDK在线API及常用工具类

    API http://tool.oschina.net/apidocs/apidoc?api=jdk-zh Java SE常用工具类 java.util.Arrays java.util.Collec ...

  3. redistemplate优雅地操作redis redis 工具类

    参考:https://www.cnblogs.com/superfj/p/9232482.html redis 工具类 package com.service; import org.springfr ...

  4. java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能

    这是java高并发系列第16篇文章. 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们 ...

  5. java树形结构工具类

    一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...

  6. 带有连接池的Http客户端工具类HttpClientUtil

    一.背景 业务开发中,经常会遇到通过http/https向下游服务发送请求.每次都要重复造轮子写HttpClient的逻辑,而且性能.功能参差不齐.这里分享一个高性能的.带连接池的通用Http客户端工 ...

  7. java.util.concurrent中的几种同步工具类

    java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...

  8. java代码(12) ---CollectionUtils工具类

    CollectionUtils工具类 CollectionUtils工具类是在apache下的,而不是springframework下的CollectionUtils 个人觉得在真实项目中Collec ...

  9. 【工具类】Stream流构建指定长度的时间集合

    package com.gabriel.stage.utils; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.Dat ...

随机推荐

  1. 理解 PHP 依赖注入 和 控制反转

    理解 PHP 依赖注入 和 控制反转   要想理解 PHP 依赖注入 和 控制反转 两个概念,就必须搞清楚如下的两个问题: DI -- Dependency Injection 依赖注入 IoC -- ...

  2. buuctf-misc-snake 详解

    打开压缩包,里面一张蛇的图片,看的我是真恶心,看了看详细信息,没什么,然后我用formstlrb分离,然后有一个压缩包 以为还像往常一样,有伪加密或者简单加密,但是居然啥也没有,里面有两个文件,key ...

  3. MVC单文件上传

    前言 现在来写下最基础的单文件上传,完成后可以扩展成各种不同的上传方式 HTML <input id="Input_File" type="file" / ...

  4. if当中是赋值怎么办

    1.Java中,赋值是有返回值的 ,赋什么值,就返回什么值.比如这题,x=y,返回y的值,所以括号里的值是1. 2.Java跟C的区别,C中赋值后会与0进行比较,如果大于0,就认为是true:而Jav ...

  5. I-Isolated Pointset

    题意:给定T组数据,每组数据有一个数n,表示点集的个数,问是否存在一个点数为n的点集,使得任意两个点组成的边的垂直平分线过点集中的第三个点 本题非常巧妙,只需构造一个由(n-2)个相同共点(圆心)等边 ...

  6. MAP;MLE

    判别学习算法:直接对问题进行求解,比如二分类问题,都是在空间中寻找一条直线从而把类别的样例分开,对于新的样例只要判断在直线的那一侧就可. ==>这种直接求解的方法称为判别学习方法 生成学习算法: ...

  7. java线程池拒绝策略使用实践

    前言 线程池是开发过程中使用频率较高的一个并发组件之一,本篇会结合踩刀哥之前的实践经验来分享一下线程池拒绝策略的真实使用场景,至于线程池内部原理只会简单介绍,有需要的可以自行上网学习. 线程池工作机制 ...

  8. PHP实现页面静态化的简单方法分享

    为什么要页面静态化? 1.动态文件执行过程:语法分析-编译-运行 2.静态文件,不需要编译,减少了服务器脚本运行的时间,降低了服务器的响应时间,直接运行,响应速度快:如果页面中一些内容不经常改动,动态 ...

  9. JWT原理

    1.COOKIE使用和优缺点 https://www.cnblogs.com/xiaonq/p/11094480.html   1.1 cookie原理: 用户名+密码 cookie是保存在用户浏览器 ...

  10. 基于Django的图书推荐系统和论坛

    基于Django的图书推荐系统和论坛 关注公众号"轻松学编程"回复"图书系统"获取源码 一.基本功能 登录注册页面 基于协同过滤的图书的分类,排序,搜索,打分功 ...