java8 java.util.stream.Stream之min/max方法 && Comparator的静态方法

一、源代码

 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泛型基础知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值