java.util.function.BinaryOperator是函数式接口,并且是lambda表达式。BinaryOperator继承自 java.util.function.BiFunction。接收两个参数返回一个相同类型的值。
name
type
description
BinaryOperator
BinaryOperator
接收两个T对象,返回T对象
例子如下:
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("X", "A");
map.put("Y", "B");
map.put("Z", "C");
BinaryOperator binaryOpt = (s1, s2) -> s1 + "-" + s2;
binaryOperatorFun(binaryOpt, map).forEach(x -> System.out.println(x));
}
private static List binaryOperatorFun(BinaryOperator binaryOpt, Map map){
List biList = new ArrayList<>();
// s1 是 map中的key; s2是 map中的value
map.forEach((s1, s2) -> biList.add(binaryOpt.apply(s1, s2)));
return biList;
}
输出结果如下:
X-A
Y-B
Z-C
在看一个例子:
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 MaxByMinBy {
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", 25, "B");
Student s4 = new Student("Ramesh", 21, "B");
List list = Arrays.asList(s1, s2, s3, s4);
Comparator ageComparator = Comparator.comparing(Student::getAge);
System.out.println("---按 className 分组,每个班级最大的年龄同学---");
Map> eldestByClass = list.stream().collect(
Collectors.groupingBy(Student::getClassName,
Collectors.reducing(BinaryOperator.maxBy(ageComparator))));
eldestByClass.forEach((k, v) -> System.out.println("Class:" + k + " Age:" +
v.get().getAge() + " Name:" + v.get().getName()));
System.out.println("---按 className 分组,找出每个班级最小的年龄同学---");
Map> youngestByClass = list.stream().collect(
Collectors.groupingBy(Student::getClassName,
Collectors.reducing(BinaryOperator.minBy(ageComparator))));
youngestByClass.forEach((k, v) -> System.out.println("Class:" + k + " Age:" +
v.get().getAge() + " Name:" + v.get().getName()));
}
}
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;
}
}
输出内容:
---按 className 分组,每个班级最大的年龄同学---
Class:A Age:23 Name:Ram
Class:B Age:25 Name:Mohan
---按 className 分组,找出每个班级最小的年龄同学---
Class:A Age:22 Name:Shyam
Class:B Age:21 Name:Ramesh