Optional<T> max​(Comparator<? super T> comparator)

这个方法看字面上的意思就是取流中最大的元素返回。但是这个最大不是通常意义上简单数据比较的那个最大,而是通过自定义的比较函数得到的计算结果。看例子:

void stream_max() {List<String> list = List.of("Mr.zhangsan","Mr.lisi","Mr.wanger","Mr.mazi");String str = list.stream().max((a,b) -> a.length()-b.length()).get();System.out.println(str);}

运行结果:

Mr.zhangsan

这个例子取的最大是指集合中字符串长度最长的那个元素。如果我们把比较方法简单修改一下,修改如下:

(a,b) -> b.length()-a.length()

运行结果就是:Mr.lisi

那这里的最大其实就是取字符串长度最小的元素,所以max方法不可以简单理解为取最大元素,主要还是看你怎么定义比较方法。

另外,需要指出如果流中存在好几个同时满足比较方法的元素那就取第一个。如上面例子,满足比较函数的元素有

"Mr.lisi"和"Mr.mazi"两个字符串,实际返回结果是“Mr.lisi”。需要再说明一下,并行流不能保证这个顺序返回元素。

这个方法还有两个不正式的用法,先看例子:

String str2 = list.stream().max((a,b) -> 1).get();System.out.println(str2);String str21 = list.stream().max((a,b) -> 0).get();System.out.println(str21);String str22 = list.stream().max((a,b) -> -1).get();System.out.println(str22);

运行结果:

Mr.zhangsan

Mr.zhangsan

Mr.mazi

如果我们要取流中第一个元素,那么就强制定义比较函数返回结果为1或0,如果要取最后一个元素那就定义返回值为-1。为什么会这样呢,因为比较过程是这样:

  1. 取第一个元素给a,第二个元素给b,然后传入比较函数进行比较
  2. 比较结果为1或0就把a作为中间计算结果保存起来,跳到第4步
  3. 比较结果为-1,那就把b作为中间计算结果保存起来,跳到第4步
  4. 把中间计算结果给a,然后取流中下个元素给b,再把这两参数传入比较函数进行比较,根据比较结果选择跳到第2步还是第3步。
  5. 遍历完流中全部元素,把最后的中间结果放到Optional中返回。

根据上面处理流程,如果强制定义比较结果为1或0,那么第一个元素会永远保留在中间结果中直至最后返回,所以其作用就像是取第一个元素,同样如果强制定义比较结果为-1,那一直会把b放入中间结果中,当循环到最后一个元素给b的时候,就把最后一个元素当作最终结果返回,作用就像是直接取流中最后一个元素返回一样。

Stream.max相关推荐

  1. Java8 Stream详解~聚合(max/min/count)

    max.min.count这些字眼你一定不陌生,没错,在mysql中我们常用它们进行数据统计.Java stream中也引入了这些概念和用法,极大地方便了我们对集合.数组的数据统计工作. 「案例一:获 ...

  2. java list find方法_Java 8 Stream - Find Max and Min from List - 入门小站-rumenz.com

    学习使用查找最小和最大日期,数字,字符,字符串或对象. Find Min or Max Date 要从日期流中获取最大或最小日期 ,可以使用Comparator.comparing( LocalDat ...

  3. java8 list max_Java 在List 上使用.max()和.stream()

    我想请求一些代码的解释,我将其作为我在 Java课程中进行的练习的解决方案. 练习是我有一个List<> of Employees,具有各种属性(薪水,姓名,姓氏,电子邮件--),我正在尝 ...

  4. JDK8新特性之Stream流

    是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西. 流可以简单的说是处理数据集合的东西,可以申明式流式A ...

  5. Java8 Stream 使用

    Stream 一般配合List 使用 常见的使用方法和程序运行结果都在下面 private static void test1() {List<Integer> integers = Ar ...

  6. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...

  7. java8函数式编程 视频_快速掌握Java8 Stream函数式编程技巧

    函数式编程优势"函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutable ...

  8. java lambda collect_45分钟学会Java8 - Lambda和Stream

    Java11已出,Java8已是主流. 现在来一波操作,应该不会太迟(T_T) 注:本文持续更新 ^_^ 1. 前言 本文主要介绍Java8的2大主要新特性lambda表达式和Stream API,2 ...

  9. java8 stream遍历_Java8新特性:Stream流详解

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...

最新文章

  1. 【转】如何用Redis做LRU-Cache
  2. 学Python从业前景如何?工作机会多吗?
  3. hp代码改成linux代码,HP Database Archiving Software远程任意代码执行漏洞
  4. Viewpager无限循环(首页与尾页平滑过渡)
  5. 初步了解Redis Streams以及如何在Java中使用它们
  6. linux shadow 时间,Linux Shadow-Password-HOWTO - 7. 将 Shadow Suite 放进来使用(1)
  7. 【原创】MySQL Proxy - 协议(部分摘录)
  8. 杭电4786--Fibonacci Tree(生成树)
  9. 如何将ffmpeg在windows编译和使用
  10. Ros_Topic通信方式
  11. php伪协议漏洞_php伪协议利用文件包含漏洞
  12. 【asp】有效防止网站留言板出现垃圾留言/评论实现思路_ASP教程
  13. 基于PHP的网上书店系统(前后台)
  14. 一文搞定十大排序算法(动画图解)
  15. linux可以使用usb无线网卡驱动,详解USB无线网卡的Linux驱动移植
  16. python图片爬虫,指定关键字爬取Google图片+搜狗图片
  17. 【巴马火麻茶】调节三高、治疗失眠、排毒减肥,轻松get长寿的秘密!
  18. 专业办公套件WPS Office 2020 for Mac
  19. layer.open打不开弹窗的问题
  20. 哪里有模板建站配云服务器销售,模板建站配云服务器费用

热门文章

  1. 王者荣耀安卓微信有什么服务器,王者荣耀安卓微信151区弦月斩
  2. 推荐算法 itemcf java_推荐系统之基于物品的协同过滤算法(ItemCF)
  3. 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(三)商业逻辑代码部分
  4. 【附源码】计算机毕业设计java校园图书漂流系统设计与实现
  5. 使用JavaScript Fetch API发送HTTP请求
  6. netty与tomcat等nio的比较(取自zhh2009在论坛里的发言)
  7. MacOS 微软办公套件 Microsoft Office
  8. mysqlplus 批量插入_mysql批量插入
  9. Mysql 配置同局域网下连接
  10. 【阅读笔记】自卑与超越