java流式编程(七)Collectors中的常用方法
目录
- 前言
- 一、创建实体类
- 二、测试数据
- 二、测试方法
- 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中的常用方法相关推荐
- java流式编程(六)Collector接口
目录 一.接口定义 二.接口泛型 一.接口定义 public interface Collector<T, A, R> {Supplier<A> supplier();BiCo ...
- Java流式编程stream
文章目录 一.简介 二.创建Stream 三.常用操作 四.其他操作 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通, ...
- Java流式编程详解
文章目录 1. 一个流的使用例子 2. 流简介 3. 流的特点 4. 流基本操作 4.1 中间操作 4.2 终端操作 5. 筛选和切片 5.1 用谓词筛选 5.2 筛选各异的元素 5.3 截短流 5. ...
- Java 流式编程stream
目录 什么是Stream? 怎么创建Stream? Stream的中间操作 Stream的终端操作 什么是Stream? Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操 ...
- 【计算机网络 15】简单几行Java代码实现迅雷功能,java流式编程原理
public static void main(String[] args) throws Exception { //1.创建一个socket连接 Socket socket = new Socke ...
- java中Lambda+流式编程讲解(心得篇)
首先举一个例子来说明,我们要在一群人里面刷选一些,首先自己写一个Person类: package 任务十三__流式计算.公司;import java.util.Objects;/*** @author ...
- Java Stream流式编程
流式编程Stream 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通,在节点被处理. 流[无存储],流不是一种数据结构 ...
- 【Java】流式编程学习笔记
文章目录 一.流简介 二.创建流 2.1 由值创建流:of 2.2 由列表创建流:stream 2.3 由 Builder 创建流:build 2.4 由文件生成流:lines 2.5 由函数生成流 ...
- java 流式_Java核心教程5: 流式编程
本次课程的标题不像之前那样易懂,是一个陌生的概念,"流式编程"是个什么东西? 在了解流式编程之前先思考一下"流",水流.电流.人流,这些都是流.而流式编程则是让 ...
最新文章
- ROS学习之URDF
- Crontab和sudo中无法使用TensorFlow ImportError libcublas.so.9.0
- windows下 sbulime text 安装less2css踩的几个坑
- 【Python】求多个字符串的最长公共前缀
- idea占用cpu过高_生产环境服务器变慢、CPU占用过高,诊断思路和性能评估谈谈?...
- 文件系统 文件时间记录在哪里_计算机系统基础:文件管理相关知识笔记
- php使用file_get_contents 或者curl 发送get/post 请求 的方法总结
- xBIM 基础07 创建WebBIM文件
- 读书笔记:普林斯顿微积分读本
- 如何将PDF转Word文档
- Excel或C语言复数运算
- 06 第三方之短信封装
- 群晖7.1使用SHR添加硬盘
- Scratch少儿编程案例-算法练习-存款收益计算
- Ubuntu16.04中安装Kermit
- 最喜欢 - 十年生死两茫茫
- Levenberg-Marquardt
- Firefox扩展初接触
- 软件流程和管理(八):质量管理
- 双连通分量(点双连通分量)