【Java】讲讲StreamAPI
预设场景:
从Mybatis调用Mapper得到的用户集合
List<UserDTO> userList = new ArrayList<>();
常用的几种API用法示例:
Map方法,转换为某一个字段的集合:
List<Integer> userIdList = userList.stream()
/* map 转换成某个类型来处理,比如这个场景是为了快速提取用户id */
.map(UserDTO::getId)
.collect(Collectors.toList());
Distinct方法,对基本类型支持去重处理:
List<Integer> distinctUserIds = userIdList.stream()
/* distinct 可对元素进行去重,推荐类型是基础包装类和String两种 */
.distinct()
.collect(Collectors.toList());
FlatMap方法,支持更深维度的处理:
List<String> fun1 = Arrays.asList("one", "two", "three");
List<String> fun2 = Arrays.asList("four", "five", "six");
List<List<String>> nestedList = Arrays.asList(fun1, fun2);
nestedList.stream()
/* flatMap 可以支持更深维度的集合转换,stream合并处理 */
.flatMap(x -> x.stream()).map(x->x.toUpperCase())
.forEach(System.out::println);
Filter方法,根据条件对集合进行过滤处理
检查名称是否包含张字的用户
List<UserDTO> matchUsers = userList.stream()
/* filter 用于检索匹配条件方法的元素 */
.filter(user -> user.getUserName().contains("张"))
/* 存在多个情况可以使用 toList 收集匹配的元素 */
.collect(Collectors.toList());
FindFirst和FindAny方法,筛选为单个
UserDTO userDTO = matchUsers.stream()
.filter(user -> "1001".equals(user.getId().toString()))
/* 或者使用 findFirst && findAny 提取唯一一个元素 */
.findFirst()
.get();
AnyMatch与AllMatch 对集合进行匹配判断:
boolean anyMatch = userList.stream()
/* anyMatch 检查任意元素是否符合匹配方法,反之 allMatch 要求所有元素符合 */
.anyMatch(user -> 3001 > user.getId());
GroupBy 等同SQL的GroupBy,但是只能是单个字段的
Map<String, List<UserDTO>> userGroupMap = userList.stream()
/* groupingBy 指定以什么值作为分组的条件,这里以用户的组名称进行分组 */
.collect(Collectors.groupingBy(UserDTO::getGroupName));
PartitionBy 则根据你的自定义的方法具体分组,但是只有true和false两种:
final Integer superPermit = 1001;
Map<Boolean, List<UserDTO>> permitPartMap = userList.stream()
/* partitioningBy 使用条件进行分区处理,场景:检查是不是超级权限的用户, 分区为 超级权限用户(true)和非超级权限用户(false) */
.collect(Collectors.partitioningBy(user -> user.getRoleIds().contains(superPermit)));
Skip与Limit 对集合支持翻页操作:
/* 用于集合的翻页操作, 等同SQL的LIMIT 10, 20 */
List<UserDTO> collect = userList.stream()
.skip(10).limit(20)
.collect(Collectors.toList());
Reduce 对集合进行聚合操作:
/* reduce用于聚合处理,例如合计这个用户集合的现金 */
BigDecimal userCashAmount = userList.stream()
.map(UserDTO::getAmount)
.reduce(new BigDecimal(0), BigDecimal::add);
【Java】讲讲StreamAPI的更多相关文章
- java讲讲几种常见的排序算法(二)
java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...
- java讲讲几种常见的排序算法
java讲讲几种常见的排序算法(一) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 以数组array={6,3,20,8,15,1}为例 冒泡排序 思路:从第0个到 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 从Tomcat无法正常关闭讲讲Java线程关闭问题【转载】
正常情况下,会优先采用catalina.sh stop来停止Tomcat实例,这样可以让服务有机会处理完请求,并做好善后工作. 但如果通过catalina.sh stop命令无法关闭Tomcat实例, ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- java中讲讲PrintWriter的用法,举例?
[学习笔记] 1.2 PrintWriter的用法 PrintWriter和PrintStream类似,只不过PrintStream是针对字节流的,而PrintWriter是针对字符流的. 例:1.2 ...
- java中讲讲DataInputStream的用法,举例?
[学习笔记] 2.4 DataInputStream的用法 马 克-to-win:DataInputStream顾名思义:就是专门用来读各种各样的数据的,比如(int,char,long等),一定要注 ...
- java中讲讲PrintStream的用法,举例?
[学习笔记] 1.2 PrintStream的用法 从学java第一天,我们就经常用到System.out.println(),实际上查阅文档可知,System.out就是Sun 编的一个Prin ...
- 讲讲java中线程池的实现
今天跟一个同学谈到java中的线程池的实现,才发现有些知识点已经记不清了,所以特意把源码打开,对官方文档做了些说明. 其实这些理解了之后,读懂源码应该是没多大问题了,有感兴趣的小伙伴们可以看完说明后自 ...
- 今儿直白的用盖房子为例,给你讲讲Java建造者模式
摘要:建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 本 ...
随机推荐
- 小米路由器4c刷入openwrt并成功进行锐捷认证
小米路由器4C 刷入openwrt 并成功进行锐捷认证 前言: 在大学中,宿舍有个路由器当然是刚需,然而,我们学校的校园网需要进行锐捷认证,常规的路由器还用不了,需要自己刷路由器或是从奸商处购买.初入 ...
- 手把手教你搭建Docker私有仓库Harbor
1.什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库.Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访 ...
- Vue学习:5.v-bind使用
第一节算是对v-bind的粗略了解,仅仅是列举了v-bind的使用.这一节将更详细的了解v-bind的具体用法. v-bind是 Vue.js 中常用的指令之一,用于动态地绑定属性或者表达式到 HTM ...
- 网易面试:SpringBoot如何开启虚拟线程?
虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小.资源利用率更高,是 Java 并发编程领域的 ...
- session 和 cookie 有什么区别?
a.存储位置不同:session 存储在服务器端:cookie 存储在浏览器端. b.安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改. c.容量和个数限制:cookie 有容量限 ...
- AIGC底层技术介绍
1.AIGC概述 AIGC,全称Artificial Intelligence Generated Content,即人工智能生成内容.这是一种新兴的人工智能技术,其核心思想是利用人工智能模型,根据给 ...
- FreeRTOS简单内核实现5 阻塞延时
0.思考与回答 0.1.思考一 为什么 FreeRTOS简单内核实现3 任务管理 文章中实现的 RTOS 内核不能看起来并行运行呢? Task1 延时 100ms 之后执行 taskYIELD() 切 ...
- JavaScript:Function:函数(方法)对象
<!DOCTYPE html><html> <head> <meta charset="utf-8"> ...
- Linux实时查看Java接口数据
1.Linux实时查看Java接口数据的方法 在Linux系统中实时查看Java接口数据通常涉及几个步骤: (1)编写Java应用程序:首先,我们需要有一个Java应用程序,它暴露了一个或多个HTTP ...
- MSSQL慢查询查询与统计
查询MSSQL慢查询: SELECT TOP 20 TEXT AS 'SQL Statement',last_execution_time AS 'Last Execution Time' ,(tot ...