Java对象列表属性映射工具类
背景
经常有这种情况,就是获取到一个对象列表之后,需要根据对象里某个字段的值去获取另一个字段的值。如下所示,有个Item对象列表,Item对象里有个id字段和Value字段,现需要根据id的值去查询value的值。
// 测试数据List<Item> items = Arrays.asList(new Item("1", "Item1"),new Item("2", "Item2"),new Item("3", "Item3"));
@Datastatic class Item {private final String id;private final String name;private String value;public Item(String id, String name) {this.id = id;this.name = name;}}@Datastatic class Value {private String id;private String value;public Value(String id, String value) {this.id = id;this.value = value;}}
实现
常规写法
如下:
// 先将id取出来List<String> ids = items.stream().map(Item::getId).collect(Collectors.toList());// 根据id获取valueMap<String, Value> valueMap = getValueMap(ids);// 遍历items,设置valueitems.stream().forEach(item -> {String id = item.getId();Value value = valueMap.get(id);if (Objects.nonNull(value)) {item.setValue(value.getValue());}});
使用工具类
写法如下:
Collection<Item> res = keyValueMapping(items,Item::getId,keys -> getValueList(keys),Value::getId,(item, values) -> item.setValue(values.get(0).getValue()),false);// 模拟工具id获取valuepublic static List<Value> getValueList(List<String> ids) {List<Value> values = Lists.newArrayList();for (String id : ids) {values.add(new Value(id, "Value" + id));}values.remove(2);return values;}
工具类代码
public class FieldMappingUtil {private FieldMappingUtil() {}public static <T, K, V> void keyValueMapping(Collection<T> list, Function<T, K> getKey,Function<List<K>, List<V>> key2Values,Function<V, K> valueGroup,BiConsumer<T, List<V>> setGroupedValues) {keyValueMapping(list, getKey, key2Values, valueGroup, setGroupedValues, false);}public static <T, K, V> void keyValueMapping(Collection<T> list, Function<T, K> getKey,Function<List<K>, List<V>> key2Values,Function<V, K> valueGroup,BiConsumer<T, List<V>> setGroupedValues,Consumer<Collection<T>> unmappedData) {boolean returnUnmappedData = Objects.nonNull(unmappedData);Collection<T> unmapped = keyValueMapping(list, getKey, key2Values,valueGroup, setGroupedValues, returnUnmappedData);if (returnUnmappedData && CollUtil.isNotEmpty(unmapped)) {unmappedData.accept(unmapped);}}public static <T, K, V, R> R keyValueMappingReturn(Collection<T> list,Function<T, K> getKey,Function<List<K>, List<V>> key2Values,Function<V, K> valueGroup,BiConsumer<T, List<V>> setGroupedValues,Function<Collection<T>, R> unmappedData) {boolean returnUnmappedData = Objects.nonNull(unmappedData);Collection<T> unmapped = keyValueMapping(list, getKey, key2Values,valueGroup, setGroupedValues, returnUnmappedData);if (returnUnmappedData && CollUtil.isNotEmpty(unmapped)) {return unmappedData.apply(unmapped);}return null;}private static <T, K, V> Collection<T> keyValueMapping(Collection<T> list,Function<T, K> getKey,Function<List<K>, List<V>> key2Values,Function<V, K> valueGroup,BiConsumer<T, List<V>> setGroupedValues,boolean returnUnmappedData) {if (CollUtil.isNotEmpty(list)) {// 源数据中非空的keyList<K> nonNullKeys = list.stream().map(getKey).filter(Objects::nonNull).collect(Collectors.toList());if (CollUtil.isNotEmpty(nonNullKeys)) {// 根据源数据获取目标数据List<V> allValues = key2Values.apply(nonNullKeys);if (CollUtil.isNotEmpty(allValues)) {// 目标数据按照key分组Map<K, List<V>> map = allValues.stream().collect(Collectors.groupingBy(valueGroup));// 遍历源数据,设置分组后的目标值return list.stream().filter(t -> {// 获取当前对象keyK key = getKey.apply(t);// 根据key获取目标数据List<V> values = map.get(key);if (CollUtil.isNotEmpty(values)) {// 设置目标值到当前对象setGroupedValues.accept(t, values);return true;} else {return returnUnmappedData;}}).collect(Collectors.toList());}}}return returnUnmappedData ? list : null;}
}
相关文章:
Java对象列表属性映射工具类
背景 经常有这种情况,就是获取到一个对象列表之后,需要根据对象里某个字段的值去获取另一个字段的值。如下所示,有个Item对象列表,Item对象里有个id字段和Value字段,现需要根据id的值去查询value的值。 // 测试数据Li…...

.net core 通过Sqlsugar生成实体
通过替换字符串的方式生成代码,其他代码也可以通这种方式生成 直接上代码 设置模板 将这几个模板文件设置为:嵌入资源 模板内容: using SqlSugar;namespace {Namespace}.Domain.Admin.{ModelName}; /// <summary> /// {TableDisplay…...

ORCA-3D避障算法解析
二维ORCA原理参考: https://zhuanlan.zhihu.com/p/669426124 ORCA原理图解 1. 找到避障速度增量 u 碰撞处理分为三种情况: (1)没有发生碰撞,且相对速度落在小圆里 (2)没有发生碰撞࿰…...

CentOS 7停更官方yum源无法使用,更换阿里源
CentOS 7官方源已经停止维护,导致无法使用yum更新软件。通过尝试使用阿里云、清华大学等第三方源解决,现以阿里云第三方源进行配置: 1、备份原有的yum源配置文件 # cp -a /etc/yum.repos.d /etc/yum.repos.d.bak 2、删除原有的yum源配置文…...
Introduction结构
写好论文的**Introduction(引言)**部分是至关重要的,因为它为读者提供了背景信息,并引导他们进入论文的核心主题。一个优秀的引言应该具备以下几个关键要素: 1. 背景介绍 概述问题:首先,你需要…...

基于SpringBoot实现SpringMvc上传下载功能实现
SpringMvc上传下载功能实现 1.创建新的项目 1)项目信息填写 Spring Initializr (单击选中)Name(填写项目名字)Language(选择开发语言)Type(选择工具Maven)Group()JDK(jdk选择17 &…...
vue 控制组件是否显示
在Vue中,控制组件的显示通常使用v-if、v-else-if、v-else或v-show指令。 1.v-if:条件性地渲染元素,如果条件为假,元素甚至不会被渲染到DOM中。 <template><div><MyComponent v-if"showMyComponent" /&…...

生产部门不给力?精益化生产管理咨询公司为您出谋划策
问题背景 近年来,许多企业的生产部门面临着各种挑战和困难。生产效率低下、产品质量不稳定、生产成本过高等问题频频出现,给企业的发展带来了困扰。面对这一现状,许多企业开始寻求专业的管理咨询公司的帮助,以期能够通过精益生产…...

HTML+CSS - 网页布局之网格布局
1. dispaly设置 display是 CSS 中用于设置元素的显示方式的属性。它决定了元素如何被渲染到页面上。不同的display值会改变元素的显示行为,包括布局、排版以及对其他元素的影响。 其中网格容器是最常用的几种方式之一,在文档中创建类似于网格的效果&…...

基于51单片机的16X16点阵显示屏proteus仿真
地址: https://pan.baidu.com/s/1JQ225NSKweqf1Zlad_f1Mw 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...

【目标检测数据集】厨房常见的水果蔬菜调味料数据集4910张39类VOC+YOLO格式
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4910 标注数量(xml文件个数):4910 标注数量(txt文件个数):4910 标注…...
在Python中统计字符串中每个字符出现的次数
在Python中统计字符串中每个字符出现的次数 在Python编程中,处理字符串是一个常见的任务。统计字符串中每个字符出现的次数不仅能考察候选人的编程能力,还能展示他们对Python内置数据结构和算法的理解。本文将详细介绍如何编写一个函数来统计字符串中每个字符出现的次数,并…...

关于 vue/cli 脚手架实现项目编译运行的源码解析
1.vue项目运行命令解析 在日常开发中,vue 项目通过vue-cli-service脚手架包将项目运行起来,常用的命令例如: npm run serve npm run build 上述执行命令实际一般对应为项目中 package.json 文件的 scripts属性中编写的脚本命令,在…...

C++笔记---继承(上)
1. 继承的简单介绍 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。 继承呈…...

气膜体育馆:为学校打造智能化运动空间—轻空间
随着教育体制的逐步升级,学校在提升学生综合素质方面的需求日益增长,特别是在体育场地方面。气膜体育馆作为一种新型的运动空间形式,正在迅速成为学校体育设施的优选方案。凭借其快速搭建、节能环保等优势,气膜馆在全国各地的校园…...
JVM 调优篇5 jvm性能监控
一 jvm性能监控 1.1 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。 体会1:使用数据说明问题,使用知识分析问题,使用工具处理问…...

一. Unity实现虚拟摇杆及屏幕自适应功能
手游里面很多类型的游戏都需要用到遥感功能,例如王者荣耀,和平精英等,之前的摇杆功能都是用类似于Easy Touch的插件进行开发的,今天不借助任何插件来实现虚拟摇杆的功能。 一般虚拟摇杆的组成都是由轮盘和遥感的点组成,…...

【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异
测试环境 mysql5.7.44 达梦2024Q2季度版 前言 在mysql 中存在 tinyint(1)的用法来实现存储0 1 作为boolean的标识列;但是在达梦并不允许使用 tinyint(1)来定义列,只能使用 tinyint 即 取值范围为ÿ…...
VUE工程中axios基本使用
安装axios npm install axios -s在main.js中引入 import http from axios Vue.prototype.$http = http将其绑定在VUE的prototype属性中 vue工程目录下,新建config文件夹,在config文件夹下新建index.js export default {...
跨服务器执行PowerShell脚本
本机和远程机都要执行 Enable-PSRemoting -Force 远程端关闭公用网络 Get-NetConnectionProfile Set-NetConnectionProfile -Name "未识别的网络" -NetworkCategory Private 本机和远程机都要执行 winrm quickconfig 将远程机ip加入信任列表 cd WSMan::localhost\…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...