java8 List的Stream流操作 (实用篇 三)

目录

java8 List的Stream流操作 (实用篇 三)

初始数据

1、Stream过滤:

过滤-常用方法

1.1 筛选单元素--年龄等于18

1.2 筛选单元素--年龄大于18

1.3 筛选范围--年龄大于18 and 年龄小于40

1.4 多条件筛选--年龄大于18 or 年龄小于40 and sex==男

1.5 多条件筛选--年龄大于18 or 年龄小于40 and sex==男 返回姓名(name)集合

2、Stream去重(集合去重和按元素去重)

去重-常用方法(关键字distinct、concat和利用set、map)

2.1 关键字distinct去重

2.2 关键字concat合并和distinct 去重

2.3 用set集合去重

2.4 用map去重--以某个元素去重

3、Stream拼接(joining)

拼接-常用方法

3.1 集合内某个字段拼接

3.2 对象内的指定元素map拼接、返回集合

3.3 对象内的指定元素map拼接、再全部拼接

4、Stream分组即组装成map(groupingBy、toMap)

分组-常用方法

4.1 groupingBy-通过年龄分组

4.2 根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)

4.3 toMap-通过userId分组(key重复会报错)

4.4 toMap-通过age分组、取前面的值

4.5 toMap-通过age分组、取后面的值

4.6 toMap-通过男女分组、并且累加age

5、Stream排序:

排序-常用方法

5.1 compareTo 关键字

5.2 Comparator.comparing() 关键方法

5.2.1 排序通常和过滤一起使用、如果元素为空会报错

5.2.2 多个元素排序方法

5.3 自定义排序

6、Stream统计(count、sum、max、min、average)

统计-常用方法

6.1 count-获取user集合中年龄大于18岁的人数

6.2 sum-获取user集合中所有人的年纪的总和

6.3 max-获取user集合中所有人年纪最大的人

6.4 min-获取user集合中所有人年纪最小的人

6.5 average-获取user集合中所有人的年纪的平均值

7、Stream分页(skip、limit)

分页-常用方法

7.1 skip:跳过前n个数据 、limit:获取前n个数据


java8 List的Stream流操作 (实用篇 三)

实际开发的时候想不起来Stream的一些常用方法、去找却很不方便、所以我准备再学一篇实用或者叫常用的stream相关方法的文章。学习整理也是方便查看

结合 java8 List的Stream流操作 (常用篇 一)_java list.stream-CSDN博客

java8 List的Stream流操作 (特别篇 二) toMap_java list tomap-CSDN博客

和实际开发中的需求、按开发使用率排

初始数据

        List<User> userList = Lists.newArrayList();userList.add(new User(1,"天一","男",16,true));userList.add(new User(2,"空二","女",19,true));userList.add(new User(3,"张三","男",18,true));userList.add(new User(4,"李四","女",38,true));userList.add(new User(5,"王五","男",18,true));userList.add(new User(6,"王六","男",18,true));userList.add(new User(7,"王七","男",18,true));userList.add(new User(7,"王七","男",18,true));userList.add(new User(8,"王七","男",null,true));

1、Stream过滤:

过滤是我们基本必用的 不管是过滤null值还是按条件过滤都是最常用的。

过滤-常用方法

1.1 筛选单元素--年龄等于18
//筛选单元素--年龄等于18
List<User> filterAgeEqual = userList.stream().filter(user -> user.getAge() == 18).collect(Collectors.toList());
1.2 筛选单元素--年龄大于18
//筛选单元素--年龄大于18
List<User> filterAgeRange = userList.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());
1.3 筛选范围--年龄大于18 and 年龄小于40
//筛选范围--年龄大于18 and 年龄小于40
List<User> filterAgeRange2 = userList.stream().filter(user -> user.getAge() > 18 && user.getAge() < 40).collect(Collectors.toList());
1.4 多条件筛选--年龄大于18 or 年龄小于40 and sex==男
//多条件筛选--年龄大于18 or 年龄小于40 and sex==男
List<User> filterAgeRange3 = userList.stream().filter(user -> user.getAge() > 18 || user.getAge() < 40 && "男".equals(user.getSex())).collect(Collectors.toList());
1.5 多条件筛选--年龄大于18 or 年龄小于40 and sex==男 返回姓名(name)集合
//多条件筛选--年龄大于18 or 年龄小于40 and sex==男  返回姓名(name)集合
List<String> nameList = userList.stream().filter(user -> (user.getAge() > 18 || user.getAge() < 40) && "男".equals(user.getSex())).map(User::getUserName).collect(Collectors.toList());

2、Stream去重(集合去重和按元素去重)

去重-常用方法(关键字distinct、concat和利用set、map)

2.1 关键字distinct去重

集合内的对象去重--结果是有序的

List<User> distinctList = userList.stream().distinct().collect(Collectors.toList());
2.2 关键字concat合并和distinct 去重

concat:合并两个流 distinct:去重

//concat:合并两个流 distinct:去重
List<User> concatAnddistinctList = Stream.concat(userList.stream(), userList.stream()).distinct().collect(Collectors.toList());
2.3 用set集合去重

集合内的对象去重--结果乱序

//集合内的对象去重--结果乱序
Set<User> setDistinct = userList.stream().collect(Collectors.toSet());
2.4 用map去重--以某个元素去重

以某个元素去重--用map集合 (v1, v2) -> v1 使用v1是表示保留age(年龄)第一次出现的对象、如果使用v2是保留age(年龄)最后一次出现的对象

List<User> mapDistinct = userList.stream().collect(Collectors.collectingAndThen(Collectors.toMap(User::getAge, Function.identity(), (v1, v2) -> v1),map -> new ArrayList<>(map.values())));

3、Stream拼接(joining)

拼接-常用方法

3.1 集合内某个字段拼接

姓名以,拼接

//姓名以,拼接
String userNameList = userList.stream().map(User::getUserName).collect(Collectors.joining(","));
3.2 对象内的指定元素map拼接、返回集合

每个对象都以 userId-userName-age 拼接、然后返回String集合

//每个对象都以 userId-userName-age 拼接、然后返回String集合
List<String> strList = userList.stream().map((User user) -> user.getUserId() + "-" + user.getUserName() + "-" + user.getAge()).collect(Collectors.toList());
3.3 对象内的指定元素map拼接、再全部拼接

每个对象都以 userId-userName-age 拼接、再以 , 拼接返回字符串

//每个对象都以 userId-userName-age 拼接、再以 , 拼接返回字符串
String userIdAndAgeNameAndList = userList.stream().map((User user) -> user.getUserId() + "-" + user.getUserName() + "-" + user.getAge()).collect(Collectors.joining(","));

4、Stream分组即组装成map(groupingBy、toMap)

分组-常用方法

4.1 groupingBy-通过年龄分组
//groupingBy-通过年龄分组
Map<Integer, List<User>> userGroupingByMap = userList.stream().collect(Collectors.groupingBy(User::getAge));userGroupingByMap.forEach((k, v) -> {System.out.println(k + ":" + v);});
4.2 根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)
//根据userId组装list对象,对应id的对象的某个属性成组(这里用的userName)
Map<Integer,List<String>> mp6 = userList.stream().collect(Collectors.groupingBy(User::getUserId, Collectors.mapping(User::getUserName, Collectors.toList())));
4.3 toMap-通过userId分组(key重复会报错)
//toMap-通过userId分组(key重复会报错)
Map<Integer, User> userToMap = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getUserId, Function.identity()));
4.4 toMap-通过age分组、取前面的值
//toMap-通过age分组、取前面的值
Map<Integer, User> userToMap2 = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getAge, Function.identity(), (v1, v2) -> v1));
4.5 toMap-通过age分组、取后面的值
//toMap-通过age分组、取后面的值
Map<Integer, User> userToMap3 = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getAge, Function.identity(), (v1, v2) -> v2));
4.6 toMap-通过男女分组、并且累加age
//toMap-通过男女分组、并且累加age
Map<String, Integer> userToMap4 = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toMap(User::getSex, User::getAge, (v1, v2) -> v1 + v2));
userToMap4.forEach((k, v) -> {System.out.println(k + ":" + v);
});

5、Stream排序:

开发中有很多都是组装的集合、而要求返回的集合是有序的 (使用率不高的原因是数据库查询支持排序)、

排序-常用方法

单元素排序方法

5.1 compareTo 关键字

(o1, o2) -> o1.getUserId().compareTo(o2.getUserId()) 升序 (o1, o2) -> o2.getUserId().compareTo(o1.getUserId()) 降序

通过指定的userId字段排序

//升序 只写sorted()默认是升序、 我是为了演示才写完整的、开发中可以直接写sorted()
List<User> sortedCompareTo = userList.stream().sorted((o1, o2) -> o1.getUserId().compareTo(o2.getUserId())).collect(Collectors.toList());//降序
List<User> sortedReversed= userList.stream().sorted((o1, o2) -> o2.getUserId().compareTo(o1.getUserId())).collect(Collectors.toList());
5.2 Comparator.comparing() 关键方法

默认升序 加reversed()为降序

//默认升序
List<User> sortedComparator = userList.stream().sorted(Comparator.comparing(User::getUserId)).collect(Collectors.toList());//reversed()为降序
List<User> sortedComparatorReversed = userList.stream().sorted(Comparator.comparing(User::getUserId).reversed()).collect(Collectors.toList());
5.2.1 排序通常和过滤一起使用、如果元素为空会报错
//排序通常和过滤一起使用、如果元素为空会报错
List<User> sortedFilter = userList.stream().filter(user -> user.getAge() != null).sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
5.2.2 多个元素排序方法

排序通常和过滤一起使用、 先用age排序、年龄相同再用userId排序(默认是升序)

//排序通常和过滤一起使用、 先用age排序、年龄相同再用userId排序(默认是升序)
Stream<User> sortedComparators = userList.stream().filter(user -> user.getAge() != null).sorted(Comparator.comparing(User::getAge).thenComparing(User::getUserId));

排序通常和过滤一起使用、 先用age排序升序、年龄相同再用userId排序降序

//排序通常和过滤一起使用、 先用age排序升序、年龄相同再用userId排序降序
Stream<User> sortedComparatorReverseds = userList.stream().filter(user -> user.getAge()!=null).sorted(Comparator.comparing(User::getAge).thenComparing(User::getUserId).reversed());
5.3 自定义排序

先按年龄再按userId自定义排序(降序)

//先按年龄再按userId自定义排序(降序)
List<User> sortedCustom = userList.stream().sorted((u1, u2) -> {if (Objects.equals(u1.getAge(), u2.getAge())) {return u2.getAge() - u1.getAge();} else {return u2.getUserId() - u1.getUserId();}
}).collect(Collectors.toList());

6、Stream统计(count、sum、max、min、average)

统计-常用方法

6.1 count-获取user集合中年龄大于18岁的人数
//count-获取user集合中年龄大于18岁的人数
Long count = userList.stream().filter(user->user.getAge() > 18).count();
System.out.println("user集合中年龄大于18岁的人数:"+count);
6.2 sum-获取user集合中所有人的年纪的总和
//sum-获取user集合中所有人的年纪的总和
Long summingLong = userList.stream().map(User::getAge).collect(Collectors.summingLong(Integer::longValue));
System.out.println("user集合中所有人的年纪的总和:"+summingLong);
6.3 max-获取user集合中所有人年纪最大的人
//max-获取user集合中所有人年纪最大的人
Optional<User> max = userList.stream().max(Comparator.comparing(User::getAge));
System.out.println("user集合中年纪最大的人是:"+max.get().getUserName());
6.4 min-获取user集合中所有人年纪最小的人
//min-获取user集合中所有人年纪最小的人
Optional<User> min = userList.stream().min(Comparator.comparing(User::getAge));
System.out.println("user集合中年纪最小的人是:"+min.get().getUserName());
6.5 average-获取user集合中所有人的年纪的平均值
//average-获取user集合中所有人的年纪的平均值
Double average = userList.stream().map(User::getAge).collect(Collectors.averagingDouble(Integer::doubleValue));
System.out.println("user集合中所有人的年纪的平均值:"+ average);

7、Stream分页(skip、limit)

分页-常用方法

7.1 skip:跳过前n个数据 、limit:获取前n个数据
//skip:跳过前n个数据 、limit:获取前n个数据
List<User> skipAndLimit = userList.stream().skip(1).limit(2).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(skipAndLimit)){skipAndLimit.forEach(System.out::println);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模系列(4/4):Matlab建模实战

目录 引言 1. Matlab简介与安装 1.1 Matlab简介 1.2 Matlab的安装 2. Matlab基础操作 2.1 Matlab基础语法和常用命令 2.2 Matlab中的数据类型和数据结构 3. 用Matlab进行建模 3.1 矩阵运算与线性代数 矩阵运算 3.2 Matlab中的绘图功能 绘制2D图形 绘制3D图形 3.3…

springboot 搭建一个 测试Kafka 集群连通性demo

废话不多说直接上代码&#xff1a; 1.pom <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka --><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><ve…

物联网技术-第5章-物联网数据处理

目录 1.物联网数据特征 2.物联网数据处理 &#xff08;1&#xff09;数据清洗 &#xff08;2&#xff09;数据存储 &#xff08;3&#xff09;数据融合 &#xff08;4&#xff09;数据挖掘 3.大数据基本概念 4.云计算基本概念 &#xff08;1&#xff09;背景 &#xf…

PHP框架之Zend Framework框架

Zend Framework框架详解 Zend Framework&#xff08;简称ZF&#xff09;是一个用面向对象的代码实现的服务器端PHP框架&#xff0c;它提供了一个结构来开发Web应用程序和服务。Zend Framework以其模块化设计和企业级功能而闻名&#xff0c;广泛应用于各种PHP开发场景。 一、Z…

RTD 基础知识——电阻温度检测器简介

电阻温度检测器或 RTD 可能是简单的温度传感器类型。这些设备的工作原理是金属的电阻随温度变化。纯金属通常具有正的电阻温度系数&#xff0c;这意味着它们的电阻随温度升高而增加。RTD 可在 -200 C 至 850 C 的较大温度范围内工作&#xff0c;并提供高精度、出色的长期稳定性…

HoVer-Net复现:手把手带你实现细胞核的分割与分类,并输出叠加图像|24-06-21

小罗碎碎念 先说一下&#xff0c;只要你跟着我一步一步走&#xff0c;你能实现的效果——对细胞核进行分割和分类&#xff0c;并在原始图像上以颜色叠加的方式直观地展示这些结果。 昨天我在交流群里进行了一下预热&#xff0c;并且提供了一些前期的教程&#xff0c;反响还不…

C# 实现去除多行文本框光标闪烁,并设置行距

一、前言 本篇主要通过继承RichTextBox 的方式实现去除多行文本框的光标闪烁&#xff0c;以及能够设置行距大小&#xff0c;这是因为C#提供的TextBox 和 RichTextBox 本身无这样的功能 二、代码 封装 RichTextBox 为CustomTextBox using System; using System.Collections.Ge…

benchmark系列——Unixbench跑分优化之shell测试项优化

一、shell测试项源码分析 通过查看unixbench Run文件&#xff0c;可以看到unixbench的shell测试项调用了pgms/looper "shell8" > { "logmsg" > "Shell Scripts (8 concurrent)", "cat" > system, "prog" > …

IP地址介绍

一、IP地址的点分十进制 ip地址在计算机内部使用中&#xff0c;ip地址实际上是一个4字节、32bit的二进制数&#xff0c;但是为了让人好识别&#xff0c;将每个字节换为十进制数&#xff0c;在以地点分开的方式表示&#xff0c;这种方式就是点分十进制。 二、ABCDE这几类IP、网…

解决element-plus没有导出的成员FormInstance

使用element-plus的el-form时&#xff0c;报错“"element-plus"”没有导出的成员“FormInstance”。你是否指的是“FooterInstance”? 解决方法&#xff1a; 引入ElForm类型&#xff0c;在外重新定义FormInstance的类型为ElForm的实例类型 示例&#xff1a; import…

React+TS前台项目实战(十四)-- 响应式头部导航+切换语言相关组件封装

文章目录 前言Header头部相关组件1. 功能分析2. 相关组件代码详细注释3. 使用方式4. Gif图效果展示 总结 前言 在这篇博客中&#xff0c;我们将封装一个头部组件&#xff0c;根据不同设备类型来显示不同的导航菜单&#xff0c;会继续使用 React hooks 和styled-components库来…

Oracle最终还是杀死了MySQL

起因 大约15年前&#xff0c;Oracle收购了Sun公司&#xff0c;从而也拥有了MySQL&#xff0c;互联网上关于Oracle何时会“扼杀MySQL”的讨论此起彼伏。 当时流传着各种理论&#xff1a;从彻底扼杀 MySQL 以减少对 Oracle 专有数据库的竞争&#xff0c;到干掉 MySQL 开源项目&…

【React】ECharts柱状图的使用和封装

使用步骤&#xff1a; 1.安装 npm install echarts2.引入 ECharts // 柱状图组件 import * as echarts from echarts import { useEffect, useRef } from react // 1. 把功能代码都放到这个组件中 // 2. 把可变的部分抽象成prop参数const BarChart ({ title }) > {const…

qt开发-07_radioButton

QRadioButton 部件提供了一个带有文本标签的单选框&#xff08;单选按钮&#xff09;。 QRadioButton 是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的选项按钮。 单选框通常呈现给用户一个“多选一”的选择。也就是说&…

Emacs之复制时:禁止转换成tab符号(一百三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

如何准备人防工程乙级资质所需的信用承诺书

理解要求 首先&#xff0c;详细阅读和理解人防工程乙级资质申请指南中关于信用承诺书的具体要求。 查阅相关的法律法规&#xff0c;如《中华人民共和国建筑法》、《中华人民共和国合同法》、《工程设计行政许可资质管理办法》等&#xff0c;确保承诺内容符合法律框架。 2. 收…

购物网站系统

摘 要 随着互联网的快速发展&#xff0c;不同的平台软件也不断涌出市场&#xff0c;在众多的平台中&#xff0c;购物网站深受人们的欢迎&#xff0c;也成为生活中不可缺少的一部分。经过对国内外购物情况的调查&#xff0c;社区购物在近几年来成为电商发展的新趋势&#xff0c…

构建可扩展的Python API与框架:实践与指南

构建可扩展的Python API与框架&#xff1a;实践与指南 一、引言 在当今的软件开发中&#xff0c;可扩展性已成为一个不可或缺的特性。一个可扩展的API或框架不仅能够满足当前的需求&#xff0c;还能轻松应对未来的变化和增长。本文将深入探讨在Python中如何设计一个可扩展的A…

递归乘法00

题目链接 递归乘法 题目描述 注意点 保证乘法范围不会溢出 解答思路 使用加法代替乘法&#xff0c;递归计算A * B&#xff0c;每个递归的过程加上一个A&#xff0c;且对B减1&#xff0c;直到B为0为止 代码 class Solution {public int multiply(int A, int B) {if (B 0…

C++ 教程 - 05 构建编译

文章目录 构建工具cmake安装与使用CMakeLists.txt编写使用案例 构建工具 cmake, Cross Platform Make&#xff0c; &#xff08;对C&#xff09;跨平台编译工具&#xff0c;将CMakeLists.txt 文件编译为对应的文件&#xff0c;如linux下的 Makefile&#xff0c;然后使用make命…