一说明

经过前一篇的StreamAPI学习,基本的流操作我相信大家都熟练于心了,那么今天是要详细解析一下收集器(collect)这么API

前提要区分,collect(StreamAPI)与collection(集合),collectors(StreamAPI静态工厂是一种归约操作)是个不同的东西

二 Collect

初始化信息

  1. public List<Car> InitCar(){
  2. ArrayList<Car> carList = new ArrayList<>();
  3. Car car1 = new Car("100", "black", "中国", 20);
  4. Car car2 = new Car("101", "gray", "中国", 30);
  5. Car car3 = new Car("102", "yello", "中国", 50);
  6. Car car4 = new Car("103", "silvery", "英国", 20);
  7. Car car5 = new Car("104", "red", "英国", 30);
  8. carList.add(car1);
  9. carList.add(car2);
  10. carList.add(car3);
  11. carList.add(car4);
  12. carList.add(car5);
  13. return carList;
  14. }

1数量

  1. @Test
  2. public void countTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求数量
  5. Long count = cars.stream().collect(Collectors.counting());
  6. System.out.println(count);//5
  7. }

2 最大值

  1. @Test
  2. public void maxTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求车价格最大值的车
  5. Comparator<Car> carComparator = Comparator.comparingDouble(Car::getPrice);
  6. Optional<Car> maxOptional = cars.stream().collect(Collectors.maxBy(carComparator));
  7. // Car(code=102, color=yello, factory=中国, price=50.0)
  8. System.out.println(maxOptional.get());
  9. }

3 最小值

  1. @Test
  2. public void minTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求车价格最小值的车
  5. Comparator<Car> carComparator = Comparator.comparingDouble(Car::getPrice);
  6. Optional<Car> maxOptional = cars.stream().collect(Collectors.minBy(carComparator));
  7. // Car(code=100, color=black, factory=中国, price=20.0)
  8. System.out.println(maxOptional.get());
  9. }

4求和

  1. @Test
  2. public void sumTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求所有车价格的总和
  5. Double collect = cars.stream().collect(Collectors.summingDouble(Car::getPrice));
  6. System.out.println(collect);//150.0
  7. }

5求均值

  1. @Test
  2. public void avgTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求所有车价格的均值
  5. Double collect = cars.stream().collect(Collectors.averagingDouble(Car::getPrice));
  6. System.out.println(collect);//30.0
  7. }

6字符串连接

  1. @Test
  2. public void joinTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求所有车颜色字符串的拼接
  5. String collect = cars.stream().map(Car::getColor).collect(Collectors.joining(","));
  6. System.out.println(collect);//black,gray,yello,silvery,red
  7. }

7 归约

  1. @Test
  2. public void reduceTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求所有车价格的总和
  5. Double collect = cars.stream()
  6. .collect(Collectors.reducing(0.0, Car::getPrice, (number, number2) -> number + number2));
  7. System.out.println(collect);//150.0
  8. }

8 分组

根据车的制造地分组。分为 中国和英国2组

  1. @Test
  2. public void groupingByTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 根据车的制造地分组
  5. Map<String, List<Car>> collect = cars.stream()
  6. .collect(Collectors.groupingBy(Car::getFactory));
  7. //{中国=[Car(code=100, color=black, factory=中国, price=20.0),
  8. // Car(code=101, color=gray, factory=中国, price=30.0),
  9. // Car(code=102, color=yello, factory=中国, price=50.0)],
  10. // 英国=[Car(code=103, color=silvery, factory=英国, price=20.0),
  11. // Car(code=104, color=red, factory=英国, price=30.0)]}
  12. System.out.println(collect);
  13. }

9 多级分组

  1. @Test
  2. public void moreGroupingByTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 根据车的制造地分组,再根据车的价格分组
  5. Map<String, Map<Double, List<Car>>> collect = cars.stream()
  6. .collect(Collectors.groupingBy(Car::getFactory, Collectors.groupingBy(Car::getPrice)));
  7. //{中国={20.0=[Car(code=100, color=black, factory=中国, price=20.0)],
  8. // 50.0=[Car(code=102, color=yello, factory=中国, price=50.0)],
  9. // 30.0=[Car(code=101, color=gray, factory=中国, price=30.0)]},
  10. // 英国={20.0=[Car(code=103, color=silvery, factory=英国, price=20.0)],
  11. // 30.0=[Car(code=104, color=red, factory=英国, price=30.0)]}}
  12. System.out.println(collect);
  13. }

10 分区

分区是分组里面的一种,只根据true,false进行分组。

  1. @Test
  2. public void groupingByAndCountTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 根据车的价格是否大于30分区
  5. Map<Boolean, List<Car>> collect = cars.stream()
  6. .collect(Collectors.partitioningBy(o -> o.getPrice() > 30));
  7. //{false=[Car(code=100, color=black, factory=中国, price=20.0),
  8. // Car(code=101, color=gray, factory=中国, price=30.0),
  9. // Car(code=103, color=silvery, factory=英国, price=20.0),
  10. // Car(code=104, color=red, factory=英国, price=30.0)],
  11. // true=[Car(code=102, color=yello, factory=中国, price=50.0)]}
  12. System.out.println(collect);
  13. }

11 收集为List

  1. @Test
  2. public void toListTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. //
  5. List<String> collect = cars.stream()
  6. .map(Car::getColor)
  7. .collect(Collectors.toList());
  8. // [black, gray, yello, silvery, red]
  9. System.out.println(collect);
  10. }

12 收集为set

  1. @Test
  2. public void toSetTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. //
  5. Set<Double> collect = cars.stream()
  6. .map(Car::getPrice)
  7. .collect(Collectors.toSet());
  8. // [20.0, 50.0, 30.0]
  9. System.out.println(collect);
  10. }

13 提取key-val转为map

  1. @Test
  2. public void toMapTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 提取新元素key,val转为map
  5. Map<String, Double> collect = cars.stream()
  6. .collect(Collectors.toMap(Car::getColor, Car::getPrice));
  7. // {red=30.0, gray=30.0, black=20.0, yello=50.0, silvery=20.0}
  8. System.out.println(collect);
  9. }

14 提取元素归约收集

  1. public void mapperTest(){
  2. List<Car> cars = carFunFactory.InitCar();
  3. // 提取 元素转为List
  4. List<String> collect = cars.stream()
  5. .collect(Collectors.mapping(Car::getColor, Collectors.toList()));
  6. // [black, gray, yello, silvery, red]
  7. System.out.println(collect);
  8. }

三 特别说明

之前的求和,平均值,最大值等还有一种求法,主要是 double ,int long类型。以下示例是double型。

  1. @Test
  2. public void summarizingTest(){
  3. List<Car> cars = carFunFactory.InitCar();
  4. // 求所有车价格的总和
  5. DoubleSummaryStatistics collect = cars.stream().collect(Collectors.summarizingDouble(Car::getPrice));
  6. System.out.println(collect.getSum());//150.0
  7. System.out.println(collect.getAverage());//30.0
  8. System.out.println(collect.getMax());//50.0
  9. System.out.println(collect.getMin());//20.0
  10. System.out.println(collect.getCount());//5
  11. }

四致谢

这次搜集器讲完,打算后面再讲解一下并行流,后面就会进入时间操作,有兴趣爱学习的朋友可以关注我公众号,支持一下,谢谢。

java8-StreamAPI之collection归约操作的更多相关文章

  1. 项目记事【StreamAPI】:使用 StreamAPI 简化对 Collection 的操作

    最近项目里有这么一段代码,我在做 code-review 的时候,觉得可以使用 Java8 StreamAPI 简化一下. 这里先看一下代码(不是源码,一些敏感信息被我用其他类替代了): privat ...

  2. JAVA8新特性--集合流操作Stream

    原文链接:https://blog.csdn.net/bluuusea/article/details/79967039 Stream类全路径为:java.util.stream.Stream 对St ...

  3. mpi中利用自定义归约操作实现merge

    在归并排序中,很重要的一步是将两个排序数组合并成一个数组,这个操作叫merge.merge操作可以用来解决某些Top K问题. 问题描述 在哼唱搜索中,用户通过哼唱一个音乐片段去搜索与其相似的音乐.后 ...

  4. Scala 归约操作- - - - -reduce

    object 归约操作_reduce { def main(args: Array[String]): Unit = { val list=List(,,,,) val result=list.red ...

  5. Java8 新特性之集合操作Stream

    Java8 新特性之集合操作Stream Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同 ...

  6. 关于OpenMP的归约操作reduction

    这里提一个重要的点 像这样 ; void ff() { sum += 0.5; } //main() #pragma omp parallel for reduction(+:sum) ; i < ...

  7. Java8 新特性 Stream 短路终端操作

    短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 none ...

  8. Java8 Lambda表达式和流操作如何让你的代码变慢5倍

    原文出处:ImportNew 有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格——iterator 和 for- ...

  9. 关于Java8:StreamAPI的一点记录

    关于 Stream ,Functional Interface 的一点记录 stream对于集合操作的便捷度提升: import java.util.ArrayList; import java.ut ...

随机推荐

  1. [ML机器学习 - Stanford University] - Week1 - 01 Introduction

    What is Machine Learning? Two definitions of Machine Learning are offered. Arthur Samuel described i ...

  2. Android的系统框架

    Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核.  图1:Android系统架构图 每 ...

  3. 【NHOI2018】衰减

    [解题思路] 显然这题并不难,由于数据范围较小,完全可以用DFS解决. 从原数开始每次变异的图谱,每次记录住当前的路径. 当找到1时就可以输出并回溯了. 小技巧:printf和scanf可以提高输出输 ...

  4. kipmio占用cpu资源过高

    虽然这是一个利用空余的CPU资源进行一些接口自动调节的任务,但看着占那么多的资源还是怕出意外. 可以临时降低 echo 100 > /sys/module/ipmi_si/parameters/ ...

  5. C语言基础 -- 变量

    常用变量类型 ​​ 地址 小端 低地址保存低位,高地址保存高位 常用于 PC(复杂指令集) 大端 低地址保存高位,高地址保存低位 常用于 ARM/手机/网络(精简指令集)

  6. ElasticSearch如何一次查询出全部数据—基于Scroll

    Elasticsearch 查询结果默认只显示10条,可以通过设置from及size来达到分页的效果(详见附3),但是 from + size <= 10,000,因为index.max_res ...

  7. surfer白化

    surfer白化的方法: 方法一: 1.griddata需白化的文件(surfer处理成grd格式,也就是surfer绘图的基本数据格式) 注意:用surfer转换格式时,插值间距(spacing)大 ...

  8. 格式化JS代码

    平常在项目中经常会遇到下载别人的js文件都是加密过的,不方便阅读都是一整行, 个人无法进行阅读,浏览器能够识别出来,所以就可以使用浏览器进行格式化js代码: 1.打开浏览器chrome为例,打开使用j ...

  9. 使用SSH服务远程管理主机(使用密钥)

    使用ssh服务远程管理主机 SSH是建立在应用层和传输层基础上的安全协议,目的是要在非安全网络上提供安全的远程登录和其他安全网络服务. 通过SSH连接可以远程管理Linux等设备,默认linuxssh ...

  10. SpringCache自定义过期时间及自动刷新

    背景前提 阅读说明(十分重要) 对于Cache和SpringCache原理不太清楚的朋友,可以看我之前写的文章:Springboot中的缓存Cache和CacheManager原理介绍 能关注Spri ...