Java8新特性 - Stream - 13 - Stream的max()、min()方法详解

1.方法介绍

【方法签名】
		1.Optional max(Comparator comparator);
		2.Optional min(Comparator comparator);
【方法属性】终结方法
【方法参数】函数式接口Comparator,可以直接传入一个Lambda表达式;
      处理逻辑 是 比较器。
【方法作用】
		1.Optional max : 根据自定义的比较器,返回最大值;
		2.Optional min : 根据自定义的比较器,返回最小值。
		【是reduce方法的一个特例】
【方法的返回值】Optional 类型的对象,可以通过get()方法获取具体的值
(Optional是java8中的新特性,目的是完善空指针异常的问题)

2.案例代码

2.1 代码

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());

    }
}

2.2 执行结果

在这里插入图片描述

3.max源码解析

以max的源码解析为例,min的同理可得

3.1 追踪我们自己的代码

代码如下 : 在 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

3.2 追踪作者的代码

》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,则返回第二个值
因此,每次我们进行比较的时候,都会获取到最大的一个值】

4.完成

Congratulations!
You are one step closer to success!

你可能感兴趣的:(JAVA基础篇,java8,Stream,max方法,min方法)