前提:以下基于 List<Student> 列表进行举例,大家实际使用进行举一反三即可。大同小异,Java8 的流式计算功能很强大,需要大家实际应用中逐渐挖掘更高级的用法。

Student 类大致如下:

public class Student {/*** 学号*/private String number;/*** 姓名*/private String name;/*** 性别*/private String gender;/*** 分数*/private BigDecimal score;// 以下 Getter 和 Setter 方法省略...
}

1. 过滤。比如你要在学生列表中过滤出性别为男性的学生,并形成一个新的列表。

studentList// 开启流式计算, 所有要使用流式计算的都需要先开启,比如另外一种场景 Stream.of(数组).stream()// filter方法即为过滤.filter(v -> "男".equals(v.getGender()))// 将结果转成 list.collect(Collectors.toList())

2.List转Map。比如学号对于学生来说是一一对应的,想通过学号能够直接获取到对应的学生,这时候我们可以使用 Map 的键值对来进行实现,如果使用 List 每次还要遍历获取。

studentList.stream()// Collectors.toMap() 有3个重载,建议使用3个或4个参数的重载方法// 1参:转化后Map的key; 2参:转化后Map的值; 3参:如果key值有重复,使用什么覆盖策略; 4参:转化后Map的类型// Student::getNumber 是双冒号用法, 可以通过 类名::方法名 指定调用哪个方法获取到结果// v -> v 表示直接使用 List 中的对象作为实例; 如果使用学生名称作为值, 则可以 v -> v.getName()// (v1, v2) -> v2 表示如果有相同的key,则使用后面的值覆盖key已经有的值。如果(v1, v2) ->v1, 则不覆盖,保留key已经有的值。Map相同的key只能有一个。(注意:如果不指定覆盖策略,遇到相同key会抛异常).collect(Collectors.toMap(Student::getNumber, v -> v, (v1, v2) -> v2))

3.获取List中的对象某个字段形成列表。比如需要获取学生的名字列表。

studentList.stream()// 将列表中的学生对象映射成名字字段.map(Student::getName)// 可以对结果进行去重.distinct().collect(Collectors.toList());

4.想获取学号为 123 的学生。

studentList.stream()// 过滤出学号为 123 的学生.filter(v -> "123".equals(v.getNumber()))// 假如 过滤出的结果如果有多个,但我们只需要一个可以使用以下方法,表示返回第一个找到的。// 还可以返回任意一个,使用 findAny().findFirst()// 如果找不到则返回 null.orElse(null)

5. 分数是 BigDecimal 类型,怎么求和?

student.stream()// 先把实体都映射成分数字段.map(v -> v.getScore())// 这个方法用得不多,它的常用方法都被分装起来了,比如sum(), count(), min(), max()等// reduce 有三个重载方法,以下只介绍2个参数的// 1参:初始值; 2参:每一个元素和前一个结果如何运算.reduce(BigDecimal.ZERO, BigDecimal::add)
// 如果 List 中是 基本类型的包装类型, 比如 List<Integer> 则更方便。list.stream()// 映射成 int 类型.mapToInt(Integer::intValue)// 求和。计数可以使用 count(), 取最小可以使用 min(), 求平均值可使用 average()等等.sum()

6. 学生按性别进行分组。

studentList.stream()// 使用 groupingBy 进行分组.collect(Collectors.groupingBy(Student::getGender))
// 如果要按分数进行分组呢?比如成绩<60的分到F组,60<=成绩<80分到C组,80<=成绩<90分到B组, 90<=成绩分到A组final BigDecimal SIXTY = new BigDecimal("60");
final BigDecimal EIGHTY = new BigDecimal("80");
final BigDecimal NINETY = new BigDecimal("90");Map<String, List<Student>> map = list.stream()// groupingBy 1参返回的会作为结果Map中的key.collect(Collectors.groupingBy(item -> {if (SIXTY.compareTo(item.getScore()) > 0) {// (, 60)return "F";}if (SIXTY.compareTo(item.getScore()) <= 0&& EIGHTY.compareTo(item.getScore()) > 0) {// [60, 80)return "C";}if (EIGHTY.compareTo(item.getScore()) <= 0&& NINETY.compareTo(item.getScore()) > 0) {// [80, 90)return "B";}if (NINETY.compareTo(item.getScore()) <= 0) {// [90, )return "A";}return "其他";}));

额外内容:

如果使用了流式计算,怎么进行调试?Idea可以使用如下方法:

1. 打断点,在需要调试的Stream上 stream() 行 或 之后的行 上进行断点标记。

2. 执行到断点后,点击 Idea 调试窗口(Debug) 上的 Trace Current Stream Chain 即可。

作者有话说:如果有幸帮助到你,麻烦给个赞,给个收藏,给个关注,感谢!你的赞,收藏和关注是我的动力源泉

[编程] Java8 Stream(流式计算) 常见的一些用法汇总相关推荐

  1. java8/Stream流式计算从入门到精通/函数式编程实战

    摘要:Stream流式计算,本文讲解了Stream流式计算的概念,具体的使用步骤以及源码实现,最后讲解了使用Stream过程中需要注意的事项.Stream在公司项目中被频繁使用,在性能优化上具有广泛的 ...

  2. Java stream流式计算详解

    Java stream流式计算详解 1. Stream概述 1.1 Stream简介 1.2 Stream分类 2. Stream操作 2.1 Stream创建 2.2 Stream无状态操作 2.3 ...

  3. JavaSE-常用类、Stream 流式计算

    JavaSE-常用类.Stream 流式计算 常用类 内置包装类 Integer String 类型转换 StringBuilder(JDK1.5) StringBuffer(JDK1.0) Date ...

  4. Stream流式计算

    一.什么是Stream流式计算(学习此之前,要先知道四大函数式接口) 1.常用的集合是为了存储数集,而对于集合数据的一些处理(像筛选集合数据等)可以使用Stream流来处理         2.jav ...

  5. mysql流式计算,Stream流式计算

    Stream流式计算 什么是Stream流式计算 数据处理中不可缺少的两部分:存储 + 计算 集合.MySQL本质就是存储数据的,计算都应该交给流来操作! package com.kuang.stre ...

  6. Java8 Stream流式操作接口详解

    stream是用于集合使用的流式操作,可使用collection.stream获取流 default Stream<E> stream() {return StreamSupport.st ...

  7. 【深入理解函数式编程】stream流式提取字符串中数字

    问题 字符串处理是日常开发中接触最频繁的一种,如何从字符串中提取符合特定条件的信息则是更为频繁.本文介绍一种利用stream方式来提取字符串中数字的方法,供学习借鉴和参考,以便今后能够加以应用. 方法 ...

  8. JDK1.8 Java8 Stream流 认知以及常见使用

    注意前提条件: 环境一定是JDK1.8 现在大部分都是1.8的环境,同样也要学习.使用.对其认知,可以使我们开发效率提高,不至于别人请教的时候不清楚. /*** @ClassName User* @D ...

  9. Java8 Stream流式编程,极大解放你的生产力!

    java8自带常用的函数式接口 Predicate<T> boolean test(T t) 传入一个参数返回boolean值 Consumer<T> void accept( ...

最新文章

  1. java 注解去掉缓存_java spring 使用注解来实现缓存
  2. C# 制作开机自动启动程序
  3. 【项目管理】接手一支技术团队,你会做些哪些事?
  4. 计算机科学与技术属于教育技术学么,计算机教育-计算机教育与教育技术学有什么不同吗?我学的专业是计算机教育,我想 爱问知识人...
  5. ibatisnet 学习手记(1)
  6. 【计算机网络】分层结构
  7. 学习经验浅谈——论做学习笔记的重要性
  8. 基于springboot2.0.6版本的TX-LCN分布式事务搭建说明
  9. 滚动时RecyclerView对ViewHolder的缓存与复用
  10. 翻转课堂计算机语言逻辑性,通达翻转课堂模式下大学数学教学模式的探讨
  11. 中国人的英文名和外国人的中文名
  12. 前端项目中使用百度地图api,含实例
  13. 一款基本靠谱,略微出圈的2021十大科技预测
  14. 使用小米天气API获取天气信息
  15. javac -d,-cp是什么意思
  16. PCB设计中如何区分 滤波电容、去耦电容、旁路电容
  17. 红米Note10Pro安装twrp教程
  18. PCB设计中的MARK点,你知道怎么放?
  19. 简单双向LSTM模型实战项目
  20. git 原理 基础学习

热门文章

  1. RxJS——创建数据流
  2. 廖雪峰python视频教程-福利 | 廖雪峰官方Python教程,拿走不谢!
  3. 超详细Redis入门教程!
  4. 图像处理(六)滤波降噪
  5. 解决开放平台的证书错误:ValidatorException:PKIX path validation failed
  6. IGP协议-EGP协议-RIP协议路由-水平分割-毒性逆转-RIP周期更新
  7. 机械毕业设计题目推荐,接近10万套,部分目录如下:
  8. MyBatis SQL语句详解
  9. 小程序商城源码代码分析
  10. 大学linux考试题,大学考试的LINUX试题参考答案(8)