一、源代码

 Optional<T> min(Comparator<? super T> comparator);
 Optional<T> max(Comparator<? super T> comparator);

需要传给它一个Comparator对象。Java 8提供了一个新的静态方法comparing,使用它可以方便地实现一个比较器。

min从集合中获取最小值
max从集合中获取最大值
Optional则是对空值的处理

二、Comparator的静态工厂方法

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor) {
	Objects.requireNonNull(keyExtractor);
	return (Comparator<T> & Serializable)(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

Function接口的功能
传入的是一个Function对象,Function的作用是将类型T转换成类型R。

@FunctionalInterface
public interface Function<T, R> {
	R apply(T t);
}

Comparator本身是一个函数接口

@FunctionalInterface
public interface Comparator<T> {
	int compare(T o1, T o2); 	
}
//Comparator.comparing方法中这段实际就是compare这块函数接口的实现 ()->{}
(Comparator<T> & Serializable)(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
//c1,c2的类型是T

//Function.apply的入参限定为<? super T>,c1,c2是可以作为函数的入参
//TODO: 这里Function为什么不是<? extends T>
Function<? super T, ? extends U> keyExtractor

//<T, U extends Comparable<? super U>> 能够知道限定了U的类型Comparable的子类,
// <? super U>简单说明:
// U implements Comparable<U>
// C extends U  
//--> C implements Comparable<U>   compareTo(U o) ,而不是C implements Comparable<C> compareTo(C o)
//compareTo(C o) 方法传入类型U就会因为类型不匹配,编译报错,所以C中的方法要 变成 C implement Comparable<? super C>。
R r1 = keyExtractor.apply(c1);
R r2 = keyExtractor.apply(c2);
//这个返回值肯定是个int类型
r1.compareTo(r2);



(Comparator<T> & Serializable)(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
等价于

Comparator<T>  comparator = (c1,c2)->{
	R r1 = keyExtractor.apply(c1);
	R r2 = keyExtractor.apply(c2);
    return r1.compareTo(r2);
}
Serializable 只是标记可序列化

Java基础知识点
java.lang.Comparable
Java泛型基础知识

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐