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

Stream之高级函数的更多相关文章

  1. javascript高级函数

    高级函数 安全的类型检测 js内置的类型检测并非完全可靠,typeof操作符难以判断某个值是否为函数 instanceof在多个frame的情况下,会出现问题. 例如:var isArray = va ...

  2. js 高级函数 之示例

    js 高级函数作用域安全构造函数 function Person(name, age)    {        this.name = name;        this.age = age;     ...

  3. 浅谈JS中的高级函数

    在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅如此,还能被一个函数返回!可以说,在JS中,函数无处不在,无所不能,堪比孙 ...

  4. php一些高级函数方法

    PHP高级函数 1.call_user_func (http://php.net/manual/zh/function.call-user-func.php) 2.get_class (http:// ...

  5. Python函数式编程(二):常见高级函数

    一个函数的参数中有函数作为参数,这个函数就为高级函数. 下面学习几个常见高级函数. ---------------------------------------------------------- ...

  6. Python函数式编程(一):高级函数

    首先有一个高级函数的知识. 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(x, y, f): return f(x) + f(y) 当我们调用add(-, , abs ...

  7. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  8. Tensorflow BatchNormalization详解:3_使用tf.layers高级函数来构建带有BatchNormalization的神经网络

    Batch Normalization: 使用tf.layers高级函数来构建带有Batch Normalization的神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴 ...

  9. Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络

    Batch Normalization: 使用tf.layers高级函数来构建神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearningai课程 课程笔 ...

随机推荐

  1. linux 端口80占用问题

    主要是搭建一次ghost博客网站改成80端口无法启动提示被占用. 提示:80端口被占用,启动失败. netstat -ano 或者 netstat -apn | grep 80 没有发现占用80端口的 ...

  2. Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了

    这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...

  3. Linux下Oracle新建用户并且将已有的数据dmp文件导入到新建的用户下的操作流程

    Oracle新建用户并且将已有的数据dmp文件导入到新建的用户下的操作流程 1.切换到oracle用户下 su - oracle 2.登录sqlplus sqlplus /nolog 3.使用sysd ...

  4. Spring boot中注册Servlet

    Spring boot中注册Servlet 如何在spring boot项目中注册Servlet呢? 如何在spring boot项目中注册Servlet呢? 由于没有web.xml,无法直接在xml ...

  5. Redis详解(三)——

    redis https://www.cnblogs.com/zhangyinhua/p/14504717.html

  6. Linux下SSH以及SSH秘钥

    一.基于秘钥方式实现远程连接 第一步:创建密钥对(在管理端服务器上操作) 中间的输入项可以直接回车 ssh-keygen -t dsa 第二步:分发公钥(在管理端服务器执行) 这个步骤需要输入一个ye ...

  7. Cython 模块扩展 - 编程语言 替代实现 应用领域 汇总一览

    Python 本身只是一种编程语言规范,可以使用其它编程语言实现它或扩展它:譬如:采有 Python C Java .Net 等重实现 Python,而采用 Python C/C++ C# Java ...

  8. AQS快速入门

    一.模板方法模式 父子类多态,父类中用一个方法调用执行所有所需要的方法: 父类: 子类: 主线程执行时候调用父类的模板方法: 二.AQS思想 sync都是独占锁,lock显示锁也是,只有读写锁是共享锁 ...

  9. FileWriter文件文件字符输出流写入存储数据

    1.FileWriter文件字符输出流-写入-存储数据 其中,流关闭之后再调用会报IOException; 其中,与文件字符输入流-写出-读取数据 和 字节输出流-写入-存储数据 不同的是,要先flu ...

  10. Redis-初见

    目录 启动and连接 JRedis 宝塔 Redis.conf RDB AOF(Append Only File) 发布和订阅 主从复制 一主二从 复制原理 宕机后的手动配置主机 哨兵模式 Redis ...