上回文说到了有关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聚合函数

最新文章

  1. SQL语句小总结
  2. C迷途指针
  3. docker中清理冗余的image,container
  4. iOS 通过代码关闭应用程序
  5. 【数学相关、规律】Codeforces 696B Puzzles
  6. Matlab中边缘提取方法简析
  7. Block使用中的一些要注意的地方
  8. EF 6.0
  9. mysql 在B数据库下 创建一个与A数据库中一样的表
  10. 【Spring源码深度解析学习系列】核心类介绍(一)
  11. ,vue-router使用心得
  12. 7.通用程序设计_EJ
  13. java内存模型及内存与cpu之间的关系
  14. nginx配置websocket
  15. linux服务器上面部署ShowDoc 安装Composer
  16. PyQT5-QCheckBox按钮
  17. 【android】如何让WebView对Video标签的支持更强力
  18. BigDecimal setScale()设置无效 scale()取得的值不是setScale()设置的值
  19. Angular Elements
  20. 从零开始搭建k8s-20180301

热门文章

  1. Maven项目管理工具--简单实用与入门
  2. Consul 入门-初识
  3. java和js中for循环的区别
  4. Java通过网络图片之地址,下载到服务器
  5. C# - 习题07_计算1分2分5分硬币各有多少枚
  6. mybatis第一个程序随笔
  7. 从零开始实现简单 RPC 框架 6:网络通信之 Netty
  8. Qt5中用QLCDNumber显示时间
  9. python 逆序按行读取文件
  10. 学习Linux tar 命令:最简单也最困难