java8 java.util.stream.Stream之min/max方法 && Comparator的静态方法
需要传给它一个Comparator对象。Java 8提供了一个新的静态方法comparing,使用它可以方便地实现一个比较器。传入的是一个Function对象,Function的作用是将类型T转换成类型R。Optional则是对空值的处理。min从集合中获取最小值。max从集合中获取最大值。
·
一、源代码
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泛型基础知识
更多推荐
已为社区贡献1条内容
所有评论(0)