【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)又叫生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 本 ...
随机推荐
- MySQL学习笔记-约束
约束 约束是作用于表中字段上的规则,用于限制存储在表中的数据,保证数据库中数据的正确.有效和完整. 一. 常用的约束 约束作用于表中的字段,可以在创建表或修改表的时候添加约束. AUTO_INCREM ...
- Java方法传参中"..."的作用
# Java方法传参中 `...` 类型名 介绍 - <font color = 'blue'>**类型 ... 类型名**</font> 表示可变长度的参数,本质是**数组* ...
- c# 拖拽列表顺序 | 拖拽合并分组 | 移除分组功能
动图演示: 背景: 一开始做功能的时候没有增加排序的索引(sort-index),后来要求做拖拽排序功能:所以写了这个不需要初始排序就可以完成的拖拽功能:如果是table表格排序逻辑和这个相似,这里拿 ...
- webpack externals忽略不打入的包
例如项目中使用从 CDN 引入 jQuery,而不是把它打包进来使用 import $ from 'jquery' webpack.config.js externals: { jquery: 'jQ ...
- Nodejs静态资源管理 路由
express提供了一个非常好用的方法,叫做 express.static(),通过此方法,可以非常方便地创建一个静态web资源服务器 app.use(express.static('public') ...
- Apollo config配置中心 配置列表和map DEMO
Apollo config配置中心 配置列表和map DEMO#支持可扩展 Apollo配置 apollo中配置如下: defaultId = 100,200 chooseId = {"30 ...
- 高德地图查询结果返回INVALID_USER_IP错误解决
高德地图查询结果返回INVALID_USER_IP错误解决 方法是添加白名单.IP白名单出错,发送请求的服务器IP不在IP白名单内开发者在LBS官网控制台设置的IP白名单不正确.白名单中未添加对应服务 ...
- Unity下简易字符串指令调试
Unity下简易字符串指令调试 输入相应的字符串命令即可调用特定的方法,比如让角色等级提升,生成特定数量的Boss等 using System; using UnityEngine; using Sy ...
- QT学习:01 工程文件详解
--- title: framework-cpp-qt-01-工程文件详解 EntryName: framework-cpp-qt-01-project-file date: 2020-04-08 1 ...
- BufferCache的简单理解
对于磁盘和文件系统来讲 Buffer对应磁盘数据的缓存,用于读或写. Cache对应文件数据的页缓存,用于读或写. Buffer可以用来聚合多个写操作,Cache则可以理解为预读操作,文件系统通过这两 ...