【Java 8 新特性】Java 8 Collectors:reducing 示例(List分组取最值)
简介
Java 8 Collectors.reducing
利用Comparator(比较器)
和BinaryOperator(二元运算符)
进行减少流中的元素。
Collectors.reducing
返回带有Optional
数据的Collector(收集器)
。
Collectors.reducing
在Java
Doc
的方法语法如下。
public static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op)
Collectors.reducing
返回一个Optional
类的收集器。
我们需要传递BinaryOperator(二元运算符)
的BinaryOperator.maxBy
或BinaryOperator.minBy
方法。
BinaryOperator(二元运算符)
将Comparator(比较器)
作为参数。
根据该Comparator(比较器)
和BinaryOperator(二元运算符)
,流元素被减少,最后可以作为一个组来收集。
使用场景
Collectors.reducing
主要用于取List
列表中的某一类型中的最大或最小的一个元素,例如下列代码,取出各个班级中年龄最大的学生信息。
注:如果最值相同,取列表顺序最先出现的一个。
代码示例
Student.java
package com.concretepage.util;
public class Student {private String name;private Integer age;private String className;public Student(String name,Integer age, String className){this.name=name;this.age=age;this.className = className;}public String getName() {return name;}public Integer getAge() {return age;}public String getClassName() {return className;}
}
ReducingDemo.java
package com.concretepage.util;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;
public class ReducingDemo {public static void main(String[] args) {Student s1 = new Student("Shyam", 22,"A");Student s2 = new Student("Ram",23,"A");Student s3 = new Student("Mohan",22,"B");Student s4 = new Student(null,21,"B");List<Student> list = Arrays.asList(s1,s2,s3,s4);Comparator<Student> ageComparator = Comparator.comparing(Student::getAge); Map<String, Optional<Student>> eldestByClass = list.stream().collect(Collectors.groupingBy(Student::getClassName, Collectors.reducing(BinaryOperator.maxBy(ageComparator))));eldestByClass.forEach((k,v)->System.out.println("Class:"+k+" Age:"+((Optional<Student>)v).get().getAge()+" Name:"+((Optional<Student>)v).get().getName()));}
}
输出
Class:A Age:23 Name:Ram
Class:B Age:22 Name:Mohan
参考文献
【1】Java 8 Collectors: reducing Example
【Java 8 新特性】Java 8 Collectors:reducing 示例(List分组取最值)相关推荐
- Java 10新特性
Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...
- Java 8 新特性 宋红康跟学
Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...
- java自动化测试语言高级之Java 9 新特性
java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 2 ...
- java自动化测试语言高级之Java 8 新特性
java自动化测试语言高级之Java 8 新特性 文章目录 java自动化测试语言高级之Java 8 新特性 Java 8 新特性 Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 ...
- 七、Java 14 新特性
七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...
- 【Stream流学习】Java 8 新特性|Collectors.joining() 案例详解
[辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...
- Java 8新特性终极指南
在Java Code Geeks上已经有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Ja ...
- stream distinct去重_再来看看Java的新特性——Stream流
半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...
- 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局
转载自 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...
- 跟我学 Java 8 新特性之 Stream 流(六)收集
转载自 跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...
最新文章
- 【怎样写代码】对象克隆 -- 原型模式(四):浅克隆与深克隆
- Bitmap的一个简单实现
- VTK:Utilities之SaveSceneToFieldData
- android2.2桌面,手机桌面课表软件
- Mysql主从复制,实现数据同步
- java多线程售票例子
- HDFS Safemode问题
- Struts2自定义标签——示例
- 使用Windows 自带防火墙拦截勒索病毒
- Mac电脑如何添加管理员账户?
- SOLIDWORDS API修改零部件属性全部保存
- 2020年系统集成项目管理工程师课教程
- ENSP教程---配置DHCP
- 增加客流量的方法_如何增加博客流量-简单的方法(27条可靠的技巧)
- 常见的国家语言缩写以及语言的代码
- “学习金字塔”的真与假
- MySQL Workbench 已停止工作 错误模块名称: KERNELBASE.dll 异常代码: 0xe0434352 程序无法正常启动:( 0xc000007b)
- 以太坊数据结构与存储分析
- 2022年上海市安全员C证特种作业证考试题库模拟考试平台操作
- Android之TBS浏览Word、Excel、PPT、PDF等文件