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,经常的做法就是对groupByLastNameloop处理。那么再看flatMap的用法

/**
 * flatMap多给数组合并成一个数组
*/
public void test_flatMap() {
  List<Child> kids = groupByLastName.values().stream()
    .flatMap(Collection::stream)
    .collect(Collectors.toList());
}

经过这和以一处理,就可以把刚才分完组后的数据结构又变成了原来的数组。

代码在GitHub

其它相关

➢ Java8,Stream之filter简单介绍

➢ Stream聚合函数

posted @ 2021-10-09 15:05  乌托拉赛文  阅读(571)  评论(0编辑  收藏  举报