Stream流操作List集合一些常用方法封装

前言介绍(如果对你有帮助,请给我点点赞)

当我们在做Java项目时,经常需要对集合进行操作。而对于List集合来说,Stream流提供了一系列便捷的方法,可以帮助我们快速地完成集合的筛选、排序、聚合等操作。但是,由于Stream流的语法比较复杂,有时候会给我们带来一定的困扰。

为了解决这个问题,我在做项目的过程中,通过学习和总结,封装了一些常用的Stream流操作方法。这些方法可以让我们更加方便地对List集合进行处理,提高开发效率并减少出错的风险。

在下面的文档中,我将分享这些方法的实现思路和使用方法,希望能够对大家在日常开发中遇到的类似问题有所帮助

1、方法示例

批量修改集合对象的某个值

public static void main(String[] args) {//创建假数据, 对象属性为  id ,  nameTUser u1 = new TUser("1","张三");TUser u2 = new TUser("2","李四");TUser u3 = new TUser("3","王五");TUser u4 = new TUser("4","赵六");List<TUser> userList = new ArrayList<>();//将对象添加到集合中userList.add(u1);userList.add(u2);userList.add(u3);userList.add(u4);//TODO 引用【批量修改集合对象的某个值】,实现将集合中所有对象的name修改为 坤哥//参数1:要处理的集合//参数2:要修改的属性//参数3:修改的值setListObjectByProperty(userList,TUser::setName,"坤哥");for (TUser tUser : userList) {System.out.println("修改后的对象:" + tUser);}
}

输出结果如下:

修改后的对象:TUser{id='1', name='坤哥'}
修改后的对象:TUser{id='2', name='坤哥'}
修改后的对象:TUser{id='3', name='坤哥'}
修改后的对象:TUser{id='4', name='坤哥'}

2、方法封装

import org.springframework.beans.BeanUtils;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;public class StreamUtils {/*** 批量修改集合对象的某个值* @param list: 待修改集合* @param consumer: 修改属性 泛型属性对象的set方法  Object::set方法* @param val: 新值* @param <T>: 目标对象泛型* @param <V>: 目标值泛型*/public static <T,V> void setListObjectByProperty(List<T> list, BiConsumer<T,V> consumer, V val){list.forEach(bean -> consumer.accept(bean,val));}/*** 修改集合中满足条件的对象的指定属性的值* @param list: 目标集合* @param conditionProperty: 条件属性   Objecg::getFiled();* @param conditionValue: 条件值* @param consumer: 修改的属性 Objecg::setFiled();* @param newValue: 修改值* @param <T>: 目标对象泛型* @param <V>: 目标值泛型* @param <U>: 修改值泛型*/public static <T, V, U> void updateListObjByField(List<T> list, Function<T, V> conditionProperty,V conditionValue, BiConsumer<T, U> consumer, U newValue) {list.stream().filter(element -> conditionProperty.apply(element).equals(conditionValue)).forEach(element -> consumer.accept(element, newValue));}/*** 泛型对象的属性setter接口** @param <T> 泛型类型*/public interface PropertySetter<T> {void set(T target, Object value);}/*** List<SysUser> -> List<User>* 集合复制 【泛型可以不一样,但是泛型中的属性一样】* @param sourceList: 待赋值的集合* @param targetType: 泛型.class* @param <T>* @param <R>* @return*/public static <T, R> List<R> copyList(List<T> sourceList, Class<R> targetType){return sourceList.stream().map( bean -> {try {R target = targetType.getDeclaredConstructor().newInstance();BeanUtils.copyProperties(bean,target);return target;} catch (Exception e) {e.printStackTrace();return null;}}).collect(Collectors.toList());}/*** 根据指定条件过滤List集合中指定的元素* @param inputList: 源list集合* @param propertyExtractor: 指定对象属性  Object::getVal* @param values: 过滤的集合值* @param <T>* @param <R>* @return*/public static <T, R> List<T> filterListByProperty(List<T> inputList, Function<T, R> propertyExtractor, List<R> values) {Predicate<T> condition = item -> !values.contains(propertyExtractor.apply(item));return filterList(inputList, condition);}public static <T> List<T> filterList(List<T> inputList, Predicate<T> condition) {return inputList.stream().filter(condition).distinct().collect(Collectors.toList());}/*** 提取List集合泛型对象中指定属性为map对象* @param inputList: 目标list* @param keyExtractor: key属性 Object:getObj* @param valueExtractor: val属性  Object:getObj* @param <T>* @param <K>* @param <V>* @return*/public static <T, K, V> Map<K, V> extractPropertyToMap(List<T> inputList, Function<T, K> keyExtractor, Function<T, V> valueExtractor) {return inputList.stream().collect(Collectors.toMap(keyExtractor, valueExtractor, (v1, v2) -> v2));}/*** 获取集合中指定元素重复的数据,并返回这个元素的值* @param list:源集合* @param propertyExtractor: 指定元素  Object::getVal* @param <T>* @param <R>* @return*/public static <T, R> List<R> findDuplicates(List<T> list, Function<T, R> propertyExtractor) {Map<R, Long> propertyCountMap = list.stream().collect(Collectors.groupingBy(propertyExtractor, Collectors.counting()));return propertyCountMap.entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList());}/*** 提取List集合中对象的某个属性并返回集合* @param inputList: 目标集合* @param propertyExtractor: 泛型对象的属性  Object::getVal* @param <T>* @param <R>* @return*/public static <T, R> List<R> extractPropertyToList(List<T> inputList, Function<T, R> propertyExtractor) {return inputList.stream().map(propertyExtractor).collect(Collectors.toList());}/*** 提取List集合中对象的某个属性* @param inputList: 目标集合* @param propertyExtractor: 泛型对象的属性  Object::getVal* @param returnType: 返回集合指定泛型  String.class* @param <T>* @param <R>* @return*/public static <T, R> List<R> extractPropertyToListWithType(List<T> inputList, Function<T, R> propertyExtractor, Class<R> returnType) {return inputList.stream().map(propertyExtractor).collect(Collectors.toList());}/*** 提取List集合中指定条件的属性值* @param list:源集合* @param filter:指定条件属性  泛型属性对象的get()方法* @param mapper:返回属性     泛型属性对象的get()方法* @param cls:返回类型* @param value:条件值* @param <T>* @param <R>* @return*/public static <T, R> List<R> extractPropertyToListWithTypeAndFilter(List<T> list, Function<T, String> filter, Function<T, R> mapper, Class<R> cls, String value) {return list.stream().filter(obj -> filter.apply(obj).equals(value)).map(mapper).collect(Collectors.toList());}/*** 校验集合中对象指定属性的值是否都满足传入条件值* @param collection: 源集合* @param propertyAccessor: 指定属性 get方法* @param expectedValue: 条件值* @param <T>* @param <E>* @return*/public static <T, E> boolean validatePropertyAll(Collection<T> collection, Function<T, E> propertyAccessor, E expectedValue) {return collection.stream().allMatch(item -> expectedValue.equals(propertyAccessor.apply(item)));}/*** 校验集合中是否有一个对象的属性值满足传入条件值* @param collection: 源集合* @param propertyAccessor: 指定属性: 指定属性的 get方法* @param expectedValue: 条件值* @param <T>* @param <E>* @return*/public static <T, E> boolean validatePropertyAny(Collection<T> collection, Function<T, E> propertyAccessor, E expectedValue) {return collection.stream().anyMatch(item -> expectedValue.equals(propertyAccessor.apply(item)));}}

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

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

相关文章

JG/T 194-2018 住宅厨房和卫生间排烟(气)道制品检测

住宅厨房、卫生间排烟气道系统是指设置在住宅楼中同一垂直位置的各层厨房或卫生间内&#xff0c;一般由排油烟机或排气扇、防火止回阀、排气道、屋面防倒灌风帽组成&#xff0c;用于排除油烟气或污浊气体的系统&#xff0c;并具备防窜气、防倒灌和防火的功能。 JG/T 194-2018住…

从零开始搭建React+TypeScript+webpack开发环境-使用iconfont构建图标库

创建iconfont项目 进入iconfont官网&#xff0c;完成注册流程&#xff0c;即可创建项目。 无法访问iconfont可尝试将电脑dns改为阿里云镜像223.5.5.5和223.6.6.6 添加图标 在图标库里选择图标&#xff0c;加入购物车 将图标添加到之前创建的项目中 生成代码 将代码配置到项目…

Flink SQL时间属性和窗口介绍

&#xff08;1&#xff09;概述 时间属性&#xff08;time attributes&#xff09;&#xff0c;其实就是每个表模式结构&#xff08;schema&#xff09;的一部分。它可以在创建表的 DDL 里直接定义为一个字段&#xff0c;也可以在 DataStream 转换成表时定义。 一旦定义了时间…

06_es分布式搜索引擎2

一、DSL查询文档 1.DSL查询分类 ①查询所有&#xff1a;match_all ②全文检索&#xff1a;利用分词器对用户输入的内容分词&#xff0c;倒排索引去匹配 match_query multi_match_query ③精确查询&#xff1a;根据精确词条查找数据&#xff0c;查找的是keyword,数值,日期,b…

大数据毕业设计选题推荐-智慧小区大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

策略模式和模板模式

这两天学习了策略模式和模板模式&#xff0c;总结一下这两种模式。 一、策略模式 策略模式的使用场景主要是同一类行为的不同实现上&#xff0c;如 不同类型的交易⽅式(信⽤卡、⽀付宝、微信)、⽣成唯⼀ID策略 (UUID、DB⾃增、DBRedis、雪花算法、Leaf算法) 策略模式主要有…

数据分析相关知识整理_--秋招面试版

一、关于sql语句(常问&#xff09; 1&#xff09;sql写过的复杂的运算 聚合函数&#xff0c;case when then end语句进行条件运算&#xff0c;字符串的截取、替换&#xff0c;日期的运算&#xff0c;排名等等&#xff1b;行列转换&#xff1b; eg&#xff1a;行列转换 SELE…

【C++】构造函数和析构函数第三部分(各种构造函数调用规则、多个对象的构造和析构、初始化列表)--- 2023.11.6

目录 各种构造函数的调用规则对象以值的方式给函数参数用一个已有的对象去初始化另一个对象函数的局部对象以值的方式从函数返回调用规则1调用规则2 多个对象的构造和析构初始化列表结束语 各种构造函数的调用规则 对象以值的方式给函数参数 实例&#xff1a; class Maker {…

Linux上编译sqlite3库出现undefined reference to `sqlite3_column_table_name‘

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 在Ubuntu 18上编译sqlite3库后在运行程序时出现undefined reference to sqlite3_column_table_name’的错误。网上的说法是说缺少SQLITE_ENABLE_COLUMN_M…

libevent

libevent 库概念和特点 开源。精简。跨平台&#xff08;Windows、Linux、maxos、unix&#xff09;。专注于网络通信&#xff08;不一定非用在网络当中&#xff0c;比如下面的读写管道&#xff09;。 libevent特性&#xff1a;基于"事件"&#xff0c;面向“文件描述符…

软件开发项目文档系列之十如何撰写测试用例

目录 1 概述1.1 编写目的1.2 定义1.3 使用范围1.4 参考资料1.5 术语定义 2 测试用例2.1 功能测试2.1.1 用户登录功能2.1.2 商品搜索功能 2.2 性能测试2.2.1 网站响应时间2.2.2 并发用户测试 附件&#xff1a; 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…

SpringBoot启动流程简介

一、Application启动类中main方法启动 SpringBootApplication(scanBasePackages {"com.springboot.lean"}) public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} } 1.1 SpringBootApplication注…

Maven中<scope>中等级的区别

标签指定了依赖项的级别吗&#xff0c;默认是compile &#xff08;编译&#xff09;。意味着依赖项将会在编译时和运行时都被包含在项目中 <scope> 标签指定了依赖项的级别为 import 。除了 import 级别&#xff0c;Maven还支持以下几种级别&#xff1a; compile &#x…

【鸿蒙软件开发】ArkUI容器组件之Grid(网格布局)

文章目录 前言一、Grid1.1 子组件GridItem是什么子组件接口属性事件示例代码 1.2 接口参数 1.3 属性1.4 Grid的几种布局模式1.5 GridDirection枚举说明1.6事件ItemDragInfo对象说明 1.7 示例代码 总结 前言 Grid容器组件&#xff1a;网格容器&#xff0c;由“行”和“列”分割…

【flask跨域问题】解决它

大概7-8年前&#xff0c;前后端还没开始分离或者刚开始分离的之前&#xff0c;跨域问题很多。 后来我就没在遇到过了&#xff0c;这次做一个小项目&#xff0c;又遇到了&#xff0c;记录下。 现在前端的脚手架都自己能解决了。 1. 跨域 是因为出于浏览器的同源策略限制。同源…

【数据结构初级(2)】单链表的基本操作和实现

文章目录 Ⅰ 概念及结构1. 单链表的概念2. 单链表的结构 Ⅱ 基本操作实现1. 定义单链表结点2. 创建新结点3. 单链表打印4. 单链表尾插5. 单链表头插6. 单链表尾删7. 单链表头删8. 单链表查找9. 在指定 pos 位置前插入结点10. 删除指定 pos 位置的结点11. 单链表销毁 本章实现的…

轻量封装WebGPU渲染系统示例<18>- 材质多pass实现GPU Compute计算(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/ComputeMaterialTest.ts 系统特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔离。…

P02项目(学习)

★ P02项目 项目描述&#xff1a;安全操作项目旨在提高医疗设备的安全性&#xff0c;特别是在医生离开操作屏幕时&#xff0c;以减少非授权人员的误操作风险。为实现这一目标&#xff0c;我们采用多层次的保护措施&#xff0c;包括人脸识别、姿势检测以及二维码识别等技术。这些…

AD9371 官方例程 NO-OS 主函数 headless 梳理(二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

数据结构-邻接表广度优先搜索(C语言版)

对于一个有向图无向图&#xff0c;我们下面介绍第二种遍历方式。 广度优先搜索&#xff0c;即优先对同一层的顶点进行遍历。 如下图所示&#xff1a; 该例子&#xff0c;我们有六个顶点&#xff0c; 十条边。 对于广度优先搜索&#xff0c;我们先搜索a&#xff0c;再搜索abc…