1.方法介绍

【方法签名】1.Optional<T> max(Comparator<? super T> comparator);2.Optional<T> min(Comparator<? super T> comparator);
【方法属性】终结方法
【方法参数】函数式接口Comparator,可以直接传入一个Lambda表达式;处理逻辑 是 比较器。
【方法作用】1.Optional<T> max : 根据自定义的比较器,返回最大值;2.Optional<T> min : 根据自定义的比较器,返回最小值。【是reduce方法的一个特例】
【方法的返回值】Optional<T> 类型的对象,可以通过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),继续追踪

   @Overridepublic 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!

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

  1. Java8新特性 Lambda、Stream、Optional实现原理

    Java8新特性 Lambda.Stream.Optional实现原理 一.接口中默认方法修饰为普通方法 二.Lambda表达式 2.1.什么是Lambda表达式 2.2.为什么要使用Lambda表达 ...

  2. JAVA8 新特性-Lamda跟Stream

    JAVA8 新特性-Lamda跟Stream 主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 Jav ...

  3. Java8新特性总结 -5.Stream API函数式操作流元素集合

    所有示例代码打包下载 : 点击打开链接 Java8新特性 : 接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/T ...

  4. 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)

    1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...

  5. java8新特性之Lambda流常用表达式的方法合集

    我们日常工作中,对于数据遍历.分组以及转换需要大量代码实现,借助java8新特性-LambdaLambda 流操作,几行代码可以帮助我们实现复杂代码,这里把 Lambda 流的常用方法用案列讲解一下. ...

  6. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

    一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...

  7. java8新特性Lambda和Stream以及函数式接口等新特性介绍

    主要内容 1.Lambda 表达式 2.函数式接口 3.方法引用与构造器引用 4.Stream API 5.接口中的默认方法与静态方法 6.新时间日期API 7.其他新特性 Java 8新特性简介 速 ...

  8. Java8新特性之三:Stream API

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

  9. Java8 新特性 -- Lambda表达式:函数式接口、方法的默认实现和静态方法、方法引用、注解、类型推测、Optional类、Stream类、调用JavaScript、Base64

    文章目录 1. Lambda表达式 1.1 Lambda表达式语法 1.2 Lambda表达式示例 1.3 说明:函数式接口 2. 方法的默认实现和静态方法 3. 方法引用 3.1 方法引用示例 4. ...

最新文章

  1. 爸,这下你还敢抽烟么?
  2. CDH6.3.2默认管理端口是7180,HDFS相关端口
  3. [Z]POJ 计算几何入门题目推荐[转PKKJ]
  4. windowsthinpc虚拟内存_windows thin pc如何开启windows功能
  5. Cacti Plugin Architecture安装
  6. Keras中LSTM的return_sequences和return_state
  7. 从C源代码到可执行文件的四个过程:预处理、编译、汇编、链接
  8. SELinux系列(八)——SELinux默认安全上下文的查询和修改(semanage命令)
  9. POJ NOI0101-08 字符三角形
  10. android判断某文件下是否you_Android_判断文件是否存在并创建代码
  11. Win 10 搭建 EasyDarwin 流服务器
  12. FileUpload文件上传控件
  13. 右耳Python小作业--快递分拣
  14. 联想笔记本win10系统加装SSD固态硬盘,系统迁移流程
  15. window10无法访问局域网共享文件夹
  16. Linux centos7.6 安装elasticsearch8.x (es8) 教程
  17. java 文件移动文件夹_java移动文件到另一个文件夹中
  18. 虹科Automation softPLC | 虹科KPA MoDK运行环境与搭建步骤(2)——MoDK运行环境搭建
  19. Codeforces Round #737 (Div. 2)---C. Moamen and XOR
  20. 投资大师索罗斯的人生轨迹 索氏投资理论 打跨英格兰银行的人 “魔鬼”索罗斯...

热门文章

  1. docker镜像指定安装源_配置docker镜像仓库源
  2. 使用Vite快速创建vue3项目(超级简单,超级快速)
  3. 海岛奇兵服务器维护公告,海岛奇兵新版本事件周期表汇总一览
  4. 数据治理案例|华泰证券数据安全治理
  5. 菜鸟学习OGRE和天龙八部之二: 天龙八部AXP数据格式搞定
  6. Ubuntu18.04 pycharm汉化
  7. Qt无故卡死关闭解决办法
  8. iOS 使用第三字体
  9. 最新版 Proteus 8.15 Professional 图文安装教程(附安装包)
  10. 打开CMD及常用的DOS命令