继续来写Java8开始的流式编码。

今天要写的是怎么从流中获取最大值、最小值。

java中获取integer最大值 java怎么取最大值_Java取对象中年龄最大的那个

为了方便没有看过前面文章的朋友,用到的类和数据,还是贴出来一下。

java中获取integer最大值 java怎么取最大值_sql_02

上面准备了一组Student对象组合的List集合。

我们先来看看怎么从集合转换成流中取出年龄最大的Student对象。

java中获取integer最大值 java怎么取最大值_sql_03

年龄最大的是一个性别为男,年龄为15的Student对象,执行一下,看看是不是获取到这样的结果了。

java中获取integer最大值 java怎么取最大值_java中获取integer最大值_04

成功地获取到了年龄最大的Student对象。

大家有没有注意到示例代码中“max((o1, o2) -> o1.getAge()-o2.getAge())”部分被idea做了波浪线标记。这是告诉我们这里可以替换更好的写法。

来看一下能替换成什么吧。

java中获取integer最大值 java怎么取最大值_java_05

执行时可以得到一样的结果。

看了上面的代码示例,通过流的方式获取集合中年龄最小的Student对象,想必大家已经知道该怎么写了吧。

对,就是下面这样了。

java中获取integer最大值 java怎么取最大值_Java取对象中年龄最大的那个_06

只需要把max方法改为min方法就可以了。就可以获取到年龄最小的的Student对象了。

在《java中有没有类似sql的group by的功能呢》写了通过java的流的方式实现类似sql的group by的功能。sql的group by时,可以对每个分组取最大值,最小值。这样的功能在java中能通过流实现吗?

来,实际操作一下。

java中获取integer最大值 java怎么取最大值_sql_07

这个就比上面的代码要稍微复杂一些了。其中“Collectors.groupingBy”方法有两个参数,第一个参数是用来描述收集后Map的key的取值,第二个参数是用来表示收集后Map的value的取值。

这里为什么不是直接用“Collectors.maxBy”,而是又在“Collectors.maxBy”外面包了一层“Collectors.collectingAndThen”方法呢。

其原因是因为通过“Collectors.maxBy”来获取Map的value,得到的是Optional类型的value。像下面这样。

java中获取integer最大值 java怎么取最大值_sql_08

执行结果我就不再赘述了。有兴趣的朋友可以自己执行一下看看。

至于通过对流进行操作获取分组后每组的最小值,大家通过上面的例子应该也知道怎么写了吧。是的,就是把“Collectors.maxBy”方法改为“Collectors.minBy”方法就可以了。

今天的内容相比较前几天的可能稍微会复杂一点,初次接触的朋友慢慢体会一下。今天就先到这里了。