继续来写Java8开始的流式编码。
今天要写的是怎么从流中获取最大值、最小值。
为了方便没有看过前面文章的朋友,用到的类和数据,还是贴出来一下。
上面准备了一组Student对象组合的List集合。
我们先来看看怎么从集合转换成流中取出年龄最大的Student对象。
年龄最大的是一个性别为男,年龄为15的Student对象,执行一下,看看是不是获取到这样的结果了。
成功地获取到了年龄最大的Student对象。
大家有没有注意到示例代码中“max((o1, o2) -> o1.getAge()-o2.getAge())”部分被idea做了波浪线标记。这是告诉我们这里可以替换更好的写法。
来看一下能替换成什么吧。
执行时可以得到一样的结果。
看了上面的代码示例,通过流的方式获取集合中年龄最小的Student对象,想必大家已经知道该怎么写了吧。
对,就是下面这样了。
只需要把max方法改为min方法就可以了。就可以获取到年龄最小的的Student对象了。
在《java中有没有类似sql的group by的功能呢》写了通过java的流的方式实现类似sql的group by的功能。sql的group by时,可以对每个分组取最大值,最小值。这样的功能在java中能通过流实现吗?
来,实际操作一下。
这个就比上面的代码要稍微复杂一些了。其中“Collectors.groupingBy”方法有两个参数,第一个参数是用来描述收集后Map的key的取值,第二个参数是用来表示收集后Map的value的取值。
这里为什么不是直接用“Collectors.maxBy”,而是又在“Collectors.maxBy”外面包了一层“Collectors.collectingAndThen”方法呢。
其原因是因为通过“Collectors.maxBy”来获取Map的value,得到的是Optional类型的value。像下面这样。
执行结果我就不再赘述了。有兴趣的朋友可以自己执行一下看看。
至于通过对流进行操作获取分组后每组的最小值,大家通过上面的例子应该也知道怎么写了吧。是的,就是把“Collectors.maxBy”方法改为“Collectors.minBy”方法就可以了。
今天的内容相比较前几天的可能稍微会复杂一点,初次接触的朋友慢慢体会一下。今天就先到这里了。