【方法签名】
1.Optional max(Comparator super T> comparator);
2.Optional min(Comparator super T> comparator);
【方法属性】终结方法
【方法参数】函数式接口Comparator,可以直接传入一个Lambda表达式;
处理逻辑 是 比较器。
【方法作用】
1.Optional max : 根据自定义的比较器,返回最大值;
2.Optional min : 根据自定义的比较器,返回最小值。
【是reduce方法的一个特例】
【方法的返回值】Optional 类型的对象,可以通过get()方法获取具体的值
(Optional是java8中的新特性,目的是完善空指针异常的问题)
package com.northcastle.I_stream;
import java.util.Optional;
import java.util.stream.Stream;
public class StreamTest12MaxMin {
public static void main(String[] args) {
//0.准备一个数组
String[] strs = {"1","5","2","3","100"};
// 1.查找最大值
Optional<Integer> max = Stream.of(strs)
.map(Integer::parseInt) // 字符串转int
.max((o1, o2) -> o1 - o2); // 取最大值
System.out.println("最大值是 : "+max.get());
//2.查找最小值
Optional<Integer> min = Stream.of(strs)
.map(Integer::parseInt) // 字符串转int
.min((o1, o2) -> o1 - o2); // 取最小值
System.out.println("最小值是 :"+min.get());
}
}
以max的源码解析为例,min的同理可得
代码如下 : 在 max的参数中,将每次的值输出出来
package com.northcastle.I_stream;
import java.util.Optional;
import java.util.stream.Stream;
public class StreamTest12MaxMin {
public static void main(String[] args) {
//0.准备一个数组
String[] strs = {"1","5","2","3","100"};
// 1.查找最大值
Optional<Integer> max = Stream.of(strs)
.map(Integer::parseInt)
.max((o1, o2) -> {
System.out.println("o1 = "+o1 +" ; o2 = "+o2);
return o1 - o2;
});
System.out.println("最大值是 : "+max.get());
}
}
执行结果如下 :
可以看出,从前两个值
开始比较,每次都用最大的值
与下一个值
进行比较
最终返回了最大的一个
o1 = 1 ; o2 = 5 【大的是5】
o1 = 5 ; o2 = 2 【大的是5】
o1 = 5 ; o2 = 3 【大的是5】
o1 = 5 ; o2 = 100 【大的是100】【执行完毕,返回100】
最大值是 : 100
》1.max抽象方法的定义:
Optional<T> max(Comparator<? super T> comparator);
》2.唯一的一个具体实现:发现是 reduce()的一个特例
》实际执行的是 BinaryOperator.maxBy(comparator)
,继续追踪
@Override
public final Optional<P_OUT> max(Comparator<? super P_OUT> comparator) {
return reduce(BinaryOperator.maxBy(comparator));
}
》3.BinaryOperator.maxBy(comparator) 的具体实现:
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
核心分析 :
如果comparator比较器中的两个值 的处理逻辑(此处我们是【第一个值-第二个值】
) ,
如果 值 大于 0,则返回第一个值
如果 值 小于 0,则返回第二个值
【因此,每次我们进行比较的时候,都会获取到最大的一个值】
Congratulations!
You are one step closer to success!