Java8使用Stream实现List中对象属性的合并(去重并求和)
前言
在需求开发中,我们需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为Pool,有name、value两个属性,其中name表示唯一值,需要value进行求和,并最后保持一份对象。
例如:("A", 1),("A", 2),("B", 5), 求和并去重的话,就是("A", 3),("B", 5)。
对象与属性
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pool {
private String name;
private int value;
}
注:这里的@Data、@NoArgsConstructor、@AllArgsConstructor是使用的Lombok注解,更多关于Lombok详解,请看Lombok使用指南
数据与测试
public static void main(String[] args) throws Exception {
List<Pool> list = new ArrayList<Pool>(){
{
add(new Pool("A", 1));
add(new Pool("A", 2));
add(new Pool("A", 3));
add(new Pool("B", 4));
add(new Pool("B", 5));
}
};
List<Pool> result = merge(list);
System.err.println(JSONObject.toJSONString(result));
}
输出结果
[
{
"name": "A",
"value": 6
},
{
"name": "B",
"value": 9
}
]
方法一
/**
* @Description 使用Java8的流进行处理,将name相同的对象进行合并,将value属性求和
* @Title merge
* @Param [list]
* @Return java.util.List<Pool>
* @Author Louis
*/
public static List<Pool> merge(List<Pool> list) {
Map<String, Pool> map = new HashMap<String, Pool>();
list.stream().forEach(pool -> {
Pool last = map.get(pool.getName());
if(null != last){
pool.setValue(pool.getValue() + last.getValue());
}
map.put(pool.getName(), pool);
});
return map.values().stream().collect(Collectors.toList());
}
方法二
/**
* @Description 使用Java8的流进行处理,将name相同的对象进行合并,将value属性求和
* @Title merge
* @Param [list]
* @Return java.util.List<Pool>
* @Author Louis
*/
public static List<Pool> merge(List<Pool> list) {
List<Pool> result = list.stream()
// 表示name为key,接着如果有重复的,那么从Pool对象o1与o2中筛选出一个,这里选择o1,
// 并把name重复,需要将value与o1进行合并的o2, 赋值给o1,最后返回o1
.collect(Collectors.toMap(Pool::getName, a -> a, (o1,o2)-> {
o1.setValue(o1.getValue() + o2.getValue());
return o1;
})).values().stream().collect(Collectors.toList());
return result;
}
总结
使用Java8的流进行处理,将name相同的对象进行合并,将value属性求和,这里推荐第二种方法,既简单更符合Java8的处理。
往期推荐
原创不易,记得支持哦!!!
微信公众号:@一个正经的程序员

Java8使用Stream实现List中对象属性的合并(去重并求和)的更多相关文章
- js 中对象属性特性的描述
如何自定义属性的特性? 用对象.属性的特性和自定义的属性的特性有什么区别? 它的四大特性 writable enumerable configable 有什么区别? 先预习一个用对象.属性 ...
- js 中对象--属性相关操作
查询属性: 可以用 对象.属性 来查询属性和属性方法 或者 对象[“属性”] 来查询属性和属性方法 演示代码: <script ...
- vue中对象属性改变视图不更新问题
常规情况下我们在vue实例的data中设置响应数据.但当数据为对象,我们增加或删除对象属性值时,视图并不触发更新,如何解决这个问题呢? let vm = new Vue{ el: '#app', da ...
- javascript中对象属性搜索原则
为什么通过对象就能访问到原型中的属性或者方法? 属性搜索原则: 1 首先会在对象本身查找有没有该属性,如果有直接返回 2 如果没有,此时就会在构造函数中查找通过this给对象添加的成员中有没有,如果有 ...
- vue数组中对象属性变化页面不渲染问题
问题引入 Vue之所以能够监听Model状态的变化,是因为JavaScript语言本身提供了Proxy或者Object.observe()机制来监听对象状态的变化.但是,对于数组元素的赋值,却没有办法 ...
- javaScript中对象属性的访问
有两种方式访问对象属性,一个是点操作符(.),一种是中括号操作符([ ]). 当你知道属性的名称时,使用点操作符: var myObj = { prop1: "val1", pro ...
- javascript中对象属性的介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)
内容简介 本文主要说明在Java8及以上版本中,使用stream().filter()来过滤一个List对象,查找符合条件的对象集合. List对象类(StudentInfo) public clas ...
- Java8 使用 stream().map()提取List对象的某一列值及排重
List对象类(StudentInfo) public class StudentInfo implements Comparable<StudentInfo> { //名称 privat ...
- typescript中对象属性可选属性与只读属性与索引签名
可选属性 type类型别名 type 会给一个类型起个新名字. type 有时和 interface 很像,但是可以作用于原始值(基本类型),联合类型,元组以及其它任何你需要手写的类型. interf ...
随机推荐
- 【赵渝强老师】Oracle RAC集群的概念
一.什么是Oracle RAC(Real Application Cluster)? Oracle RAC 是一个具有共享缓存架构的集群数据库,它克服了传统的无共享方法和共享磁盘方法的限制,为您的所有 ...
- 《MySQL 5.7从入门到精通(视频教学版)》代码课件教学视频下载
<MySQL 5.7从入门到精通(视频教学版)>代码课件教学视频下载 https://pan.baidu.com/s/1ZufDV6a_PEnjp-Bdh4IkuQ 提取码:vgnr 无版 ...
- electron 菜单选项 - 隐藏,设置菜单
隐藏菜单 const { app, Menu, session } = require('electron'); /*隐藏electron的菜单栏*/ Menu.setApplicationMenu( ...
- 泛型dotnet
// 什么是泛型List<T> T:表示类型参数,指代任意类型 T可以是任意标识 // 编写代码时使用特殊符号替代位置类型,在实例化或使用/调用时才会进行具体类型的定义 // 特点:重用代 ...
- HRM平台 - 组织结构的渲染
组织结构是一个公司的灵魂 ,多使用树型结构 : 页面格式: 渲染头部 : 头部代码: <template> <el-row type="flex" justify ...
- Oracle问题:alter update modify 的区别是什么?
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486480&idx=1 ...
- KubeSphere 部署 Zookeeper 实战教程
前言 知识点 定级:入门级 如何利用 AI 助手辅助运维工作 单节点 Zookeeper 安装部署 集群模式 Zookeeper 安装部署 开源应用选型思想 实战服务器配置(架构 1:1 复刻小规模生 ...
- 基于 KubeKey 扩容 Kubernetes v1.24 Worker 节点实战
前言 知识点 定级:入门级 KubeKey 扩容 Worker 节点 openEuler 操作系统的基本配置 Kubernets 基本命令 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不 ...
- AI五子棋_08 五子棋落子规则对应的价值
AI五子棋 第八步 恭喜你到达第八步! 利用前一步得到的棋型分析结果,考察每一个可能落子的位置,给每一个可能的位置打分,将棋子落在分数最高的位置上.根据经验,我们可以总结出下面的落子规则: 1. 致胜 ...
- Paypal绑定招商银行 —— Paypal绑定收款银行账户的注意事项
地址: https://code.newban.cn/446.html