目录

  • 前言
  • 一、创建实体类
  • 二、测试数据
  • 二、测试方法
    • 1、toCollection(collectionFactory)
    • 2、toList()
    • 3、toSet()
    • 4、toMap(keyMapper, valueMapper)
    • 5、toMap(keyMapper, valueMapper, mergeFunction)
    • 6、toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)
    • 7、toConcurrentMap(keyMapper, valueMapper)
    • 8、joining(delimiter, prefix, suffix)
    • 9、mapping( mapper, downstream)
    • 10、collectingAndThen(downstream, finisher)
    • 11、counting()
    • 12、maxBy(comparator)
    • 13、minBy(comparator)
    • 14、summingDouble(mapper)
    • 15、averagingDouble(mapper)
    • 16、summarizingDouble(mapper)
    • 17、reducing(identity,mapper, op)
    • 18、 groupingBy(classifier)
    • 19、groupingBy(classifier,downstream)
    • 20、partitioningBy(predicate, downstream)
  • 总结

前言

Collectors是Collector的工具类,类中提供了很多流收集、归约、分组、分区等方法,方便我们直接使用。


一、创建实体类

@Data
@AllArgsConstructor
public class Student {/*** 学号*/private long id;/*** 姓名*/private String name;/*** 年龄*/private int age;/*** 年级*/private String grade;/*** 语文成绩*/private double chineseScore;/*** 数学成绩*/private double mathScore;/*** 英语成绩*/private double englishScore;}

二、测试数据

     ImmutableList<Student> students;@Beforepublic void before() {Student a = new Student(1, "a", 16, "高一", 120, 130, 125);Student b = new Student(2, "b", 17, "高二", 80, 90, 80);Student c = new Student(3, "c", 18, "高三", 130.1, 130, 100);Student d = new Student(4, "d", 16, "高一", 100, 140, 110);Student e = new Student(5, "e", 17, "高二", 120, 120, 120);Student f = new Student(6, "f", 18, "高三", 130.2, 110, 100);Student g = new Student(7, "g", 16, "高一", 110, 130, 80);Student h = new Student(8, "h", 17, "高二", 90, 120, 900);students = ImmutableList.of(a, b, c, d, e, f, g, h);}

二、测试方法

1、toCollection(collectionFactory)

     @Testpublic void toCollectionTest() {//将学生年级放入集合TreeSet<String> grades = students.stream().map(Student::getGrade).collect(Collectors.toCollection(TreeSet::new));System.out.println(grades.toString());}

结果

[高一, 高三, 高二]

2、toList()

 @Testpublic void toListTest() {//将学生名字放入集合List<String> names = students.stream().map(Student::getName).collect(Collectors.toList());System.out.println(names.toString());}

结果

[a, b, c, d, e, f, g, h]

3、toSet()

     @Testpublic void toSetTest() {//将学生语文成绩放入集合Set<Double> chineseScores = students.stream().map(Student::getChineseScore).collect(Collectors.toSet());System.out.println(chineseScores.toString());}

结果

[130.0, 80.0, 90.0, 100.0, 110.0, 120.0]

4、toMap(keyMapper, valueMapper)

 @Testpublic void toMapTest() {//将学生学号和姓名放入map,当出现相同key时,会抛异常Map<Long, String> map = students.stream().collect(Collectors.toMap(student -> student.getId(), student -> student.getName()));System.out.println(map.toString());}

结果

{1=a, 2=b, 3=c, 4=d, 5=e, 6=f, 7=g, 8=h}

5、toMap(keyMapper, valueMapper, mergeFunction)

 @Testpublic void toMapWithMergeTest() {//将学生学号和班级放入map,当出现相同key时,用新值替换旧值Map<Long, String> map = students.stream().collect(Collectors.toMap(student -> student.getId(), student -> student.getGrade(), (oldValue, newValue) -> newValue));System.out.println(map.toString());}

结果

{1=高一, 2=高二, 3=高三, 4=高一, 5=高二, 6=高三, 7=高一, 8=高二}

6、toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)

 @Testpublic void toLinkedHashMapTest() {//将学生学号和班级放入自定义的LinkedHashMapLinkedHashMap<Long, String> map = students.stream().collect(Collectors.toMap(student -> student.getId(),student -> student.getGrade(),(oldValue, newValue) -> newValue,LinkedHashMap::new));System.out.println(map.toString());}

结果

{1=高一, 2=高二, 3=高三, 4=高一, 5=高二, 6=高三, 7=高一, 8=高二}

7、toConcurrentMap(keyMapper, valueMapper)

 @Testpublic void toConcurrentMapTest() {//将学生学号和班级放入ConcurrentMapConcurrentMap<Long, String> concurrentMap = students.stream().collect(Collectors.toConcurrentMap(student -> student.getId(), student -> student.getGrade()));System.out.println(concurrentMap.toString());}

结果

{1=高一, 2=高二, 3=高三, 4=高一, 5=高二, 6=高三, 7=高一, 8=高二}

8、joining(delimiter, prefix, suffix)

     @Testpublic void joiningWithPrefixAndSuffixTest() {//将学生姓名用逗号连接成一个字符串,并在字符串前加上^^^,在字符串后加上$$$String names = students.stream().map(Student::getName).collect(Collectors.joining(",","^^^","$$$"));System.out.println(names);}

结果

^^^a,b,c,d,e,f,g,h$$$

9、mapping( mapper, downstream)

 @Testpublic void mappingTest() {//将学生映射成学生名字,并收集到list中List<String> names = students.stream().collect(Collectors.mapping(Student::getName, Collectors.toList()));System.out.println(names.toString());}

结果

[a, b, c, d, e, f, g, h]

10、collectingAndThen(downstream, finisher)

 @Testpublic void collectingAndThenTest() {//先将学生年级收集到set中,再计算set的大小Integer count = students.stream().map(Student::getGrade).collect(Collectors.collectingAndThen(Collectors.toSet(), grade -> grade.size()));System.out.println(count);}

结果

3

11、counting()

 @Testpublic void countingTest() {//计算学生的数量Long count = students.stream().collect(Collectors.counting());System.out.println(count);}

结果

8

12、maxBy(comparator)

     @Testpublic void maxByTest() {//获取语文成绩最高分Optional<Double> max = students.stream().map(Student::getChineseScore).collect(Collectors.maxBy(Double::compare));System.out.println(max.get());}

结果

130.2

13、minBy(comparator)

 @Testpublic void minByTest() {//获取语文成绩最低分Optional<Double> max = students.stream().map(Student::getChineseScore).collect(Collectors.minBy(Double::compare));System.out.println(max.get());}

结果

80.0

14、summingDouble(mapper)

 @Testpublic void summingDoubleTest() {//获取所有学生语文成绩总得分Double summing = students.stream().map(Student::getChineseScore).collect(Collectors.summingDouble(a -> a));System.out.println(summing);}

结果

880.3

15、averagingDouble(mapper)

     @Testpublic void averagingDoubleTest() {//获取所有学生语文成绩平均分Double summing = students.stream().map(Student::getChineseScore).collect(Collectors.averagingDouble(a -> a));System.out.println(summing);}

结果

110.0375

16、summarizingDouble(mapper)

 @Testpublic void summarizingDoubleTest() {//返回统计数据DoubleSummaryStatistics statistics = students.stream().map(Student::getChineseScore).collect(Collectors.summarizingDouble(a -> a));System.out.println("数量:" + statistics.getCount() +"\r\n总成绩:" + statistics.getSum() +"\n最大成绩" + statistics.getMax() +"\n最小成绩" + statistics.getMin() +"\n平均成绩" + statistics.getAverage());}

结果:

数量:8
总成绩:880.3
最大成绩130.2
最小成绩80.0
平均成绩110.0375

17、reducing(identity,mapper, op)

@Testpublic void reducingTest() {//获取所有学生语文成绩总分Optional<Double> sum1 = students.stream().map(Student::getChineseScore).collect(Collectors.reducing(Double::sum));Double sum2 = students.stream().map(Student::getChineseScore).collect(Collectors.reducing(0d, Double::sum));Double sum3 = students.stream().collect(Collectors.reducing(0d, Student::getChineseScore, Double::sum));System.out.println(sum1.get());}

结果

880.3

18、 groupingBy(classifier)

 @Testpublic void groupingByTest() {//按照年级分组Map<String, List<Student>> groupByGrade = students.stream().collect(Collectors.groupingBy(Student::getGrade));System.out.println(groupByGrade);}

结果

{高三=[Student(id=3, name=c, age=18, grade=高三, chineseScore=130.1, mathScore=130.0, englishScore=100.0), Student(id=6, name=f, age=18,grade=高三, chineseScore=130.2, mathScore=110.0, englishScore=100.0)],
高二=[Student(id=2, name=b, age=17, grade=高二, chineseScore=80.0, mathScore=90.0, englishScore=80.0), Student(id=5, name=e, age=17, grade=高二, chineseScore=120.0, mathScore=120.0, englishScore=120.0), Student(id=8, name=h, age=17, grade=高二, chineseScore=90.0, mathScore=120.0, englishScore=900.0)],
高一=[Student(id=1, name=a, age=16, grade=高一, chineseScore=120.0, mathScore=130.0, englishScore=125.0), Student(id=4, name=d, age=16, grade=高一, chineseScore=100.0, mathScore=140.0, englishScore=110.0), Student(id=7, name=g, age=16, grade=高一, chineseScore=110.0, mathScore=130.0, englishScore=80.0)]}

19、groupingBy(classifier,downstream)

@Testpublic void groupingBy2Test() {//按照年级分组后统计每组中每个学生的总成绩Map<String, Map<Long, Double>> map = students.stream().collect(Collectors.groupingBy(Student::getGrade,Collectors.toMap(student -> student.getId(),student -> student.getChineseScore() + student.getEnglishScore() + student.getMathScore())));map.forEach((grade, idTotalScore) -> {idTotalScore.forEach((id, totalScore) -> {System.out.println("grade: " + grade + " id: " + id + " totalScore: " + totalScore);});});}

结果

grade: 高三 id: 3 totalScore: 360.1
grade: 高三 id: 6 totalScore: 340.2
grade: 高二 id: 2 totalScore: 250.0
grade: 高二 id: 5 totalScore: 360.0
grade: 高二 id: 8 totalScore: 1110.0
grade: 高一 id: 1 totalScore: 375.0
grade: 高一 id: 4 totalScore: 350.0
grade: 高一 id: 7 totalScore: 320.0

20、partitioningBy(predicate, downstream)

 @Testpublic void partitioningByTest() {//按照年级分组后,再根据学生总成绩是否大于300分组Map<String, Map<Boolean, List<Student>>> map = students.stream().collect(Collectors.groupingBy(Student::getGrade,Collectors.partitioningBy(student -> student.getChineseScore() + student.getEnglishScore() + student.getMathScore() > 300)));map.forEach((grade, map1) -> map1.forEach((b, list) ->list.stream().forEach(student -> System.out.println("grade: " + grade + " 是否大于300分: " + b + " id: " + student.getId()))));}

结果

grade: 高三 是否大于300分: true id: 3
grade: 高三 是否大于300分: true id: 6
grade: 高二 是否大于300分: false id: 2
grade: 高二 是否大于300分: true id: 5
grade: 高二 是否大于300分: true id: 8
grade: 高一 是否大于300分: true id: 1
grade: 高一 是否大于300分: true id: 4
grade: 高一 是否大于300分: true id: 7

总结

本文介绍了Collectors中常用的流收集的方法。

java流式编程(七)Collectors中的常用方法相关推荐

  1. java流式编程(六)Collector接口

    目录 一.接口定义 二.接口泛型 一.接口定义 public interface Collector<T, A, R> {Supplier<A> supplier();BiCo ...

  2. Java流式编程stream

    文章目录 一.简介 二.创建Stream 三.常用操作 四.其他操作 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通, ...

  3. Java流式编程详解

    文章目录 1. 一个流的使用例子 2. 流简介 3. 流的特点 4. 流基本操作 4.1 中间操作 4.2 终端操作 5. 筛选和切片 5.1 用谓词筛选 5.2 筛选各异的元素 5.3 截短流 5. ...

  4. Java 流式编程stream

    目录 什么是Stream? 怎么创建Stream? Stream的中间操作 Stream的终端操作 什么是Stream? Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操 ...

  5. 【计算机网络 15】简单几行Java代码实现迅雷功能,java流式编程原理

    public static void main(String[] args) throws Exception { //1.创建一个socket连接 Socket socket = new Socke ...

  6. java中Lambda+流式编程讲解(心得篇)

    首先举一个例子来说明,我们要在一群人里面刷选一些,首先自己写一个Person类: package 任务十三__流式计算.公司;import java.util.Objects;/*** @author ...

  7. Java Stream流式编程

    流式编程Stream 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通,在节点被处理. 流[无存储],流不是一种数据结构 ...

  8. 【Java】流式编程学习笔记

    文章目录 一.流简介 二.创建流 2.1 由值创建流:of 2.2 由列表创建流:stream 2.3 由 Builder 创建流:build 2.4 由文件生成流:lines 2.5 由函数生成流 ...

  9. java 流式_Java核心教程5: 流式编程

    本次课程的标题不像之前那样易懂,是一个陌生的概念,"流式编程"是个什么东西? 在了解流式编程之前先思考一下"流",水流.电流.人流,这些都是流.而流式编程则是让 ...

最新文章

  1. ROS学习之URDF
  2. Crontab和sudo中无法使用TensorFlow ImportError libcublas.so.9.0
  3. windows下 sbulime text 安装less2css踩的几个坑
  4. 【Python】求多个字符串的最长公共前缀
  5. idea占用cpu过高_生产环境服务器变慢、CPU占用过高,诊断思路和性能评估谈谈?...
  6. 文件系统 文件时间记录在哪里_计算机系统基础:文件管理相关知识笔记
  7. php使用file_get_contents 或者curl 发送get/post 请求 的方法总结
  8. xBIM 基础07 创建WebBIM文件
  9. 读书笔记:普林斯顿微积分读本
  10. 如何将PDF转Word文档
  11. Excel或C语言复数运算
  12. 06 第三方之短信封装
  13. 群晖7.1使用SHR添加硬盘
  14. Scratch少儿编程案例-算法练习-存款收益计算
  15. Ubuntu16.04中安装Kermit
  16. 最喜欢 - 十年生死两茫茫
  17. Levenberg-Marquardt
  18. Firefox扩展初接触
  19. 软件流程和管理(八):质量管理
  20. 双连通分量(点双连通分量)

热门文章

  1. 复制指定目录后缀文件并重命名
  2. 超实分析手机版,国际研究生数学教材
  3. 华强北再也没法生产散装 iPhone 了
  4. 远程服务器返回错误码: (507) Insufficient Storage
  5. 深度学习——致命问题之Gradient Vanish
  6. while循环语句初学
  7. NLP进阶,Bert+BiLSTM情感分析实战
  8. 图(Dijkstra,Prim,Kruskal)
  9. 你真的认为iPhone只是一部手机?苹果惊天秘密之 一
  10. 几种梯度下降法比较最小值与鞍点(SGD、Momentum、NAG、Adagrad、Adadelta与Rmsprop)