java8 stream 常用操作
遍历
// list 遍历,stream() 可省略
list.stream().forEach(e -> {
});
// map 遍历
map.forEach((k,v) -> {
});
过滤
// 保留 age > 18 的
userList.stream().filter(e -> e.getAge() > 18);
// 上面的操作其实是每个元素的年龄和 18 比较,如果大于18就返回 true,如果小于就返回 false,保留 true 的比较项
userList.stream().filter(e -> {
if(e.getAge() > 18){
return true;
} else {
return false;
}
});
// 移除 age <= 18 的(这个不是流的但是和流的过滤能做到一样的事儿,注意条件是相反的)
userList.removeIf( e -> e.getAge() <= 18);
映射
// 只要用户名
userList.stream().map( e -> e.getName());
// 转型
userList.stream().map( e -> {
Member member = new Member();
BeanUtils.copyProperties(e, member);
retuen member;
})
最值
// 数值列表(两种写法都是取最大值)
intList.stream().max(Integer::compare).get();
intList.stream().mapToInt(Integer::intValue).min().getAsInt();
// 对象列表(最大和最小年龄)
userList.stream().max(Comparator.companing(User::getAge)).get();
userList.stream().min(Comparator.companing(User::getAge)).get();
排序
// 用户列表根据年龄倒叙,相同年龄的根据分数顺序,mysql 的 order by age desc, score
userList.stream()
.sorted(Comparator
.comparing(User::getAge, Comparator.reverseOrder())
.thenComparing(User::getScore)
)
.collect(Collectors.toList());
分组
// 用性别分组
Map<String, List<Person>> sexGroup = personList.stream().collect(Collectors.groupingBy(e -> e.getSex()));
// 先用性别分组,再用区域分组
Map<String, Map<String, List<Person>>> areaGroup = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));
// 根据 店铺ID和商品ID 分组商品
Map<String, List<Item>> sexGroup = itemList.stream().collect(Collectors.groupingBy(e -> e.getShopId() + "-" + e.getItemId()));
list 转 map
效果和 分组 类似,只不过分组后 value 可能是多个,这种转型之后 value 只是一个,如果 value 是多个会报错
Collectors.toMap(param1, param2, param3)第一个参数指定 key,第二个参数指定 value,第三个参数是当key对应的 value 重复时的处理
// 用户列表转成 map(k:用户Id,v:用户)
Map<String, User> collect = userList.stream().collect(Collectors.toMap(e -> e.getId(), e -> e, (e1, e2) -> e1));
// 订单商品列表转成 map(k:商品Id,v:商品数量(如果商品id重复,数量就相加))
Map<String, Integer> collect = itemList.stream().collect(Collectors.toMap(e -> e.getItemId(), e -> e.getSize(), (e1, e2) -> e1+e2));
java8 stream 常用操作的更多相关文章
- Stream常用操作以及原理探索
Stream常用操作以及原理 Stream是什么? Stream是一个高级迭代器,它不是数据结构,不能存储数据.它可以用来实现内部迭代,内部迭代相比平常的外部迭代,它可以实现并行求值(高效,外部迭代要 ...
- JAVA8 Stream集合操作:中间方法和完结方法
StreamLambda为java8带了闭包,这一特性在集合操作中尤为重要:java8中支持对集合对象的stream进行函数式操作,此外,stream api也被集成进了collection api, ...
- Java8 Stream终端操作使用详解
话不多说,自己挖的坑自己要填完,今天就给大家讲完Java8中Stream的终端操作使用详解.Stream流的终端操作主要有以下几种,我们来一一讲解. forEach() forEachOrdered( ...
- Java8 Stream中间操作使用详解
前面两篇简单的介绍了Stream以及如何创建Stream,本篇就给大家说说stream有哪些用途,以及具体怎样使用. 再次介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的 ...
- java8 stream流操作的flatMap(流的扁平化)
https://mp.weixin.qq.com/s/7Fqb6tAucrl8UmyiY78AXg https://blog.csdn.net/Mark_Chao/article/details/80 ...
- Java8 Stream流API常用操作
Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...
- 【JDK8】Java8 Stream流API常用操作
Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...
- Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类
下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java ...
- Stream流的基本介绍以及在工作中的常用操作(去重、排序以及数学运算等)
平时工作中,我在处理集合的时候,总是会用到各种流操作,但是往往在处理一些较为复杂的集合时,还是会出现无法灵活运用api的场景,这篇文章的目的,主要是为介绍一些工作中使用流时的常用操作,例如去重.排序和 ...
- Java8 Stream 的一些操作和介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11858186.html Java8 Stream 是一个新的东西, 就是能够将常见的数据结构转 ...
随机推荐
- 解决前端发送post 请求出现403,cancled等问题
问题一:页面初始加载,部分接口首次请求options是200,然后第二次post请求cancled状态 1. 检查console控制台报错,如果是接口问题,就不用操心了 2.如果是其他报错,那么就不用 ...
- Docker容器使用 (入门到精通)
Docker容器 CentOS安装Docker Docker 分为 CE 和 EE 两大版本.CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月. D ...
- 了解 Transformers 是如何“思考”的
Transformer 模型是 AI 系统的基础.已经有了数不清的关于 "Transformer 如何工作" 的核心结构图表. 但是这些图表没有提供任何直观的计算该模型的框架表示. ...
- Snipaste下载安装(使用教程)
## Snipaste下载安装(使用教程)**一 简单介绍** Snipaste 是一个免费简单但强大的截图工具,也可以让你将截图贴回到屏幕上!下载并打开 Snipaste,按下 F1 来开始截图,再 ...
- .NET WebAPI 跨域问题(has been blocked by CORS policy:No Access-Control-Allow-Ogigin header is present on the requested resource)
一.什么是跨域 1. 跨域解释 跨域指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 同源指的是:域名,协议,端口均相同. 2. 什么情况下会导致跨域 2.1 ...
- Hyperledger Fabric部署与测试(Ubuntu)
Fabric部署与测试 Fabric部署与测试最正确的还是参照官方链接:Hyperledger Fabric官方链接 ok,接下来开始部署Fabric.(以Ubuntu为例) 一.部署Fabric 1 ...
- 磁盘有限,Docker 垃圾很多怎么办
你的电脑上可能 pull 或者 build 了很多 Docker 镜像,但是你不知道怎么清理,本文将介绍如何清理 Docker 垃圾的常见方法. docker prune 你可以通过原生的多种 pru ...
- JZOJ 2474. 【GDKOI 2021普及组DAY2】我的世界
题解 这题很明显发现一个点到另一个点,必然最多只有一个进入下界的点和一个出来的点 分类讨论入点和出点的位置 要么都在 \(u->lca\) 或都在 \(lca->v\) 或分别有一个 那就 ...
- MySQL插入数据的多种方式
插入数据的多种方式 replace关键字插入数据 语法: REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [PARTITION (partition_ ...
- 梅毒感染者能否应用TNF抑制剂
对于伴发的未经控制的任何严重感染,都不适合使用TNF抑制剂.在1998年国际上首个TNF抑制剂获批治疗类风湿关节炎(RA)以来,这就是广大临床医生和风湿性疾病患者的共识.在临床实践中,需要权衡药物的利 ...