简介

Java 8 Collectors.reducing 利用Comparator(比较器)BinaryOperator(二元运算符)进行减少流中的元素。
Collectors.reducing返回带有Optional数据的Collector(收集器)

Collectors.reducingJava Doc 的方法语法如下。

public static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op)

Collectors.reducing返回一个Optional类的收集器。

我们需要传递BinaryOperator(二元运算符)BinaryOperator.maxByBinaryOperator.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分组取最值)相关推荐

  1. Java 10新特性

    Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...

  2. Java 8 新特性 宋红康跟学

    Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...

  3. java自动化测试语言高级之Java 9 新特性

    java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 2 ...

  4. java自动化测试语言高级之Java 8 新特性

    java自动化测试语言高级之Java 8 新特性 文章目录 java自动化测试语言高级之Java 8 新特性 Java 8 新特性 Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 ...

  5. 七、Java 14 新特性

    七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...

  6. 【Stream流学习】Java 8 新特性|Collectors.joining() 案例详解

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  7. Java 8新特性终极指南

    在Java Code Geeks上已经有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Ja ...

  8. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  9. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  10. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

最新文章

  1. 【怎样写代码】对象克隆 -- 原型模式(四):浅克隆与深克隆
  2. Bitmap的一个简单实现
  3. VTK:Utilities之SaveSceneToFieldData
  4. android2.2桌面,手机桌面课表软件
  5. Mysql主从复制,实现数据同步
  6. java多线程售票例子
  7. HDFS Safemode问题
  8. Struts2自定义标签——示例
  9. 使用Windows 自带防火墙拦截勒索病毒
  10. Mac电脑如何添加管理员账户?
  11. SOLIDWORDS API修改零部件属性全部保存
  12. 2020年系统集成项目管理工程师课教程
  13. ENSP教程---配置DHCP
  14. 增加客流量的方法_如何增加博客流量-简单的方法(27条可靠的技巧)
  15. 常见的国家语言缩写以及语言的代码
  16. “学习金字塔”的真与假
  17. MySQL Workbench 已停止工作 错误模块名称: KERNELBASE.dll 异常代码: 0xe0434352 程序无法正常启动:( 0xc000007b)
  18. 以太坊数据结构与存储分析
  19. 2022年上海市安全员C证特种作业证考试题库模拟考试平台操作
  20. Android之TBS浏览Word、Excel、PPT、PDF等文件

热门文章

  1. python圆形_利用 Python 实现裁剪圆形头像
  2. php 容器源码分析,Pimple运行流程浅析(PHP容器)
  3. pimple idiom
  4. 将图片转换成caffe的数据格式
  5. 软著申请个人实名认证流程
  6. 正睿集训模拟赛 Day1
  7. Amazon alexa skill开发中遇到的坑
  8. 爬虫之模拟强智系统登录
  9. index函数python查询所有_Python List index()方法
  10. qq系统软件测试计划,软件测试设计报告案例——qq空间.doc