结构
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
}
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
}
被FunctionInteface注解标记:函数接口,只有一个抽象方法
继承BiFunction接口:R apply(T t, U u),对 T型, U型 的两个参数操作,返回 R 类
型的结果。BinaryOperator出入参为统一类型T。
两个方法:minBy方法根据指定的Comparator返回两个元素中较小的一个。maxBy根据指定的Comparator返回两个元素中较大的一个。
简单应用
public static void main(String[] args) {
// 比较整型
System.out.println(BinaryOperator.minBy(Comparator.comparing(Integer::intValue)).apply(1, 2));//1
System.out.println(BinaryOperator.maxBy(Comparator.comparing(Integer::intValue)).apply(1, 2));//2
// 比较字符串长度
System.out.println(BinaryOperator.minBy(Comparator.comparing(String::length)).apply("ab", "zxy"));//ab
System.out.println(BinaryOperator.maxBy(Comparator.comparing(String::length)).apply("ab", "zxy"));//zxy
// 比较集合大小
System.out.println(min(Arrays.asList(1,2), Collections.singletonList(3)));//[3]
System.out.println(max(Arrays.asList(1,2), Collections.singletonList(3)));//[1, 2]
// 比较角色的等级
Role knight = new Role(1, "骑士");
Role master = new Role(5, "法师");
System.out.println(BinaryOperator.minBy(Comparator.comparing(Role::getLevel)).apply(knight, master));//Test.Role(level=1, name=骑士)
System.out.println(BinaryOperator.maxBy(Comparator.comparing(Role::getLevel)).apply(knight, master));//Test.Role(level=5, name=法师)
}
public static <T> List<T> min(List<T> list1, List<T> list2){
Comparator<List<T>> comparator = Comparator.comparingInt(List::size);
return BinaryOperator.minBy(comparator).apply(list1, list2);
}
public static <T> List<T> max(List<T> list1, List<T> list2){
Comparator<List<T>> comparator = Comparator.comparingInt(List::size);
return BinaryOperator.maxBy(comparator).apply(list1, list2);
}
@Data
@AllArgsConstructor
public static class Role {
private Integer level;
private String name;
}