Stream之高级函数
上回文说到了有关Stream一些数学函数的用法、今天来说下Stream一些高级的函数用法,这些函数在日常工作中也是必不可少的,测试数据还是引用上一篇的数据。
Map
这个方法我个人称之为转换函数,把一些原始数据转换成我想要的数组结构,它返回的是Stream
对象,通过配置collection
方法使用,下面来看一栗子。老师要统计我们班的姓氏列表
/** * 给一份班级的姓氏表 */@Testpublic void test_map() { List<String> lastNameCol = this.book.getKids().stream(). map(Child::getLastName) .distinct() .collect(Collectors.toList()); }
配合collect
方法一起使用,基本能解决日常工作需要。
peek
这个方法和forEach
函数很像,唯一的区别就是返回值不一样,通过一个栗子来看下peek
的用法。把小朋友们的年龄变成分的格式
/** * 把小朋友们的年龄变成分的格式给我 */@Testpublic void test_peek() { List<Child> newKids = this.book.getKids().stream(). peek(i -> i.setAge((int) (i.getAge() * 100))) .collect(Collectors.toList()); }
其实用forEach
也用实现,但应用的场景好像并不对味。forEach
函数没有返回值,意味着是调用链中最后的方法调用。可以针对业务场景选择具体的方法调用。
Sorted
一个需要排序的集合,这种需要在工作中太经常出现了!有的时候数据库并不能满足我们的业务排序功能,那么就要手动的对源数据进行排序操作,还是通过一栗子来看下按年龄大小排序(升序)
/** * 按年龄大小排序 升序 */@Testpublic void test_sorted() { this.book.getKids().stream(). sorted(Comparator.comparing(Child::getAge)) .forEach(i -> System.out.println(i.getAge())); }
默认的是升序,可以通过指定排序方式Comparator.comparing(Child::getAge).reversed()
来降序操作。还可以通过多个维度的字段进行排序,写多个sorted
或者在一个sorted
里调用thenComparing
方法指定其他排序逻辑。
groupBy
按什么分组,这个在日志工作中也经常的运用到,一些点餐页面的首页(按商品分类分组),按地区分组,等。一个栗子按姓氏分组
@Testpublic void test_groupBy() { Map<String, List<Child>> groupByLastName = this.book.getKids().stream(). collect(Collectors.groupingBy(Child::getLastName)); }
用法很简单啊,返回的是一个Map<String, List<Child>>
的集合对象。
flatMap
flatMap
方法也是经常的用的到,我主要是拿它来合并多个数组,比如上面那个栗子,按姓氏分完组后,那如何再合并到一个集合呢?如果没有flatMap
,经常的做法就是对groupByLastName
loop处理。那么再看flatMap
的用法
/** * flatMap多给数组合并成一个数组 */public void test_flatMap() { List<Child> kids = groupByLastName.values().stream() .flatMap(Collection::stream) .collect(Collectors.toList()); }
经过这和以一处理,就可以把刚才分完组后的数据结构又变成了原来的数组。
作者:M78-Seven,原文链接:https://www.cnblogs.com/m78-seven/p/15385822.html