Collectors工具类
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工具类的更多相关文章
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- JDK在线API及常用工具类
API http://tool.oschina.net/apidocs/apidoc?api=jdk-zh Java SE常用工具类 java.util.Arrays java.util.Collec ...
- redistemplate优雅地操作redis redis 工具类
参考:https://www.cnblogs.com/superfj/p/9232482.html redis 工具类 package com.service; import org.springfr ...
- java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能
这是java高并发系列第16篇文章. 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们 ...
- java树形结构工具类
一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...
- 带有连接池的Http客户端工具类HttpClientUtil
一.背景 业务开发中,经常会遇到通过http/https向下游服务发送请求.每次都要重复造轮子写HttpClient的逻辑,而且性能.功能参差不齐.这里分享一个高性能的.带连接池的通用Http客户端工 ...
- java.util.concurrent中的几种同步工具类
java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...
- java代码(12) ---CollectionUtils工具类
CollectionUtils工具类 CollectionUtils工具类是在apache下的,而不是springframework下的CollectionUtils 个人觉得在真实项目中Collec ...
- 【工具类】Stream流构建指定长度的时间集合
package com.gabriel.stage.utils; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.Dat ...
随机推荐
- linux(centos8):安装java jdk 15 (java 15)
一,下载jdk15 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...
- nginx 快速安装
必要条件 1能访问外网 2防火墙放开80 3有软件安装权限 依次执行以下命令 一.设置CentOS7的yum源及EPEL yum源 wget -O /etc/yum.repos.d/epel.repo ...
- Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!
GitHub 17k Star 的Java工程师成神之路,不来了解一下吗! GitHub 17k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 17k Star 的Java工 ...
- win8怎样才能启用administrator登录 别的用户也是如此
但是你可以用命令调出administrator账户打开C盘,打开windows文件夹,再打开system32文件夹,找到cmd.exe右键点击选择以管理员身份运行 在里面输入net user admi ...
- Redis 入门与 ASP.NET Core 缓存
目录 基础 Redis 库 连接 Redis 能用 redis 干啥 Redis 数据库存储 字符串 订阅发布 RedisValue ASP.NET Core 缓存与分布式缓存 内存中的缓存 ASP. ...
- 腾讯云大学 x CODING | 知识分享月直播预告
经历十年的发展,DevOps 已经变成被广泛认知的研发效能方法论.DevOps 工具链作为 DevOps 落地的核心技术实践之一,在自动化和质量方面使得开发团队可以更快更好地交付产品,提高其竞争力. ...
- Zotero导入Markdown here插件
1. 下载Markdown Here源码包 网址:https://github.com/adam-p/markdown-here 2. 创建.xpi后缀文件 将文件夹 中的这几个文件放入同一个文件夹中 ...
- layui 的基本使用介绍
全局配置 layui.config({ dir: '/res/layui/' //layui.js 所在路径(注意,如果是script单独引入layui.js,无需设定该参数.),一般情况下可以无视 ...
- 一篇理解什么是CanSet, CanAddr?
什么是可设置( CanSet ) 首先需要先明确下,可设置是针对 reflect.Value 的.普通的变量要转变成为 reflect.Value 需要先使用 reflect.ValueOf() 来进 ...
- ORA-01078: failure in processing system parameters 问题的解决方法(oracle 11g)
https://blog.csdn.net/lzwgood/article/details/26358725