简介
Java 8Collectors.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 parator;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 = paring(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:RamClass:B Age:22 Name:Mohan
参考文献
【1】Java 8 Collectors: reducing Example