Stream之高级函数
上回文说到了有关Stream一些数学函数的用法、今天来说下Stream一些高级的函数用法,这些函数在日常工作中也是必不可少的,测试数据还是引用上一篇的数据。
Map
这个方法我个人称之为转换函数,把一些原始数据转换成我想要的数组结构,它返回的是Stream
对象,通过配置collection
方法使用,下面来看一栗子。老师要统计我们班的姓氏列表
/**
* 给一份班级的姓氏表
*/
@Test
public void test_map() {
List<String> lastNameCol = this.book.getKids().stream().
map(Child::getLastName)
.distinct()
.collect(Collectors.toList());
}
配合collect
方法一起使用,基本能解决日常工作需要。
peek
这个方法和forEach
函数很像,唯一的区别就是返回值不一样,通过一个栗子来看下peek
的用法。把小朋友们的年龄变成分的格式
/**
* 把小朋友们的年龄变成分的格式给我
*/
@Test
public void test_peek() {
List<Child> newKids = this.book.getKids().stream().
peek(i -> i.setAge((int) (i.getAge() * 100)))
.collect(Collectors.toList());
}
其实用forEach
也用实现,但应用的场景好像并不对味。forEach
函数没有返回值,意味着是调用链中最后的方法调用。可以针对业务场景选择具体的方法调用。
Sorted
一个需要排序的集合,这种需要在工作中太经常出现了!有的时候数据库并不能满足我们的业务排序功能,那么就要手动的对源数据进行排序操作,还是通过一栗子来看下按年龄大小排序(升序)
/**
* 按年龄大小排序 升序
*/
@Test
public 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
按什么分组,这个在日志工作中也经常的运用到,一些点餐页面的首页(按商品分类分组),按地区分组,等。一个栗子按姓氏分组
@Test
public 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());
}
经过这和以一处理,就可以把刚才分完组后的数据结构又变成了原来的数组。
其它相关
本文来自博客园,作者:乌托拉赛文,转载请注明原文链接:https://www.cnblogs.com/m78-seven/p/15385822.html