前言

在需求开发中,我们需要对一个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的处理。

往期推荐

面试官:String长度有限制吗?是多少?还好我看过!

Node起源及名称由来

Lombok使用指南

Java Logback配置文件这么写,还愁不会整理日志?

原创不易,记得支持哦!!!

微信公众号:@一个正经的程序员

Java8使用Stream实现List中对象属性的合并(去重并求和)的更多相关文章

  1. js 中对象属性特性的描述

    如何自定义属性的特性? 用对象.属性的特性和自定义的属性的特性有什么区别? 它的四大特性 writable   enumerable   configable   有什么区别? 先预习一个用对象.属性 ...

  2. js 中对象--属性相关操作

    查询属性: 可以用 对象.属性 来查询属性和属性方法               或者                    对象[“属性”]  来查询属性和属性方法 演示代码: <script ...

  3. vue中对象属性改变视图不更新问题

    常规情况下我们在vue实例的data中设置响应数据.但当数据为对象,我们增加或删除对象属性值时,视图并不触发更新,如何解决这个问题呢? let vm = new Vue{ el: '#app', da ...

  4. javascript中对象属性搜索原则

    为什么通过对象就能访问到原型中的属性或者方法? 属性搜索原则: 1 首先会在对象本身查找有没有该属性,如果有直接返回 2 如果没有,此时就会在构造函数中查找通过this给对象添加的成员中有没有,如果有 ...

  5. vue数组中对象属性变化页面不渲染问题

    问题引入 Vue之所以能够监听Model状态的变化,是因为JavaScript语言本身提供了Proxy或者Object.observe()机制来监听对象状态的变化.但是,对于数组元素的赋值,却没有办法 ...

  6. javaScript中对象属性的访问

    有两种方式访问对象属性,一个是点操作符(.),一种是中括号操作符([ ]). 当你知道属性的名称时,使用点操作符: var myObj = { prop1: "val1", pro ...

  7. javascript中对象属性的介绍

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)

    内容简介 本文主要说明在Java8及以上版本中,使用stream().filter()来过滤一个List对象,查找符合条件的对象集合. List对象类(StudentInfo) public clas ...

  9. Java8 使用 stream().map()提取List对象的某一列值及排重

    List对象类(StudentInfo) public class StudentInfo implements Comparable<StudentInfo> { //名称 privat ...

  10. typescript中对象属性可选属性与只读属性与索引签名

    可选属性 type类型别名 type 会给一个类型起个新名字. type 有时和 interface 很像,但是可以作用于原始值(基本类型),联合类型,元组以及其它任何你需要手写的类型. interf ...

随机推荐

  1. 【赵渝强老师】Oracle RAC集群的概念

    一.什么是Oracle RAC(Real Application Cluster)? Oracle RAC 是一个具有共享缓存架构的集群数据库,它克服了传统的无共享方法和共享磁盘方法的限制,为您的所有 ...

  2. 《MySQL 5.7从入门到精通(视频教学版)》代码课件教学视频下载

    <MySQL 5.7从入门到精通(视频教学版)>代码课件教学视频下载 https://pan.baidu.com/s/1ZufDV6a_PEnjp-Bdh4IkuQ 提取码:vgnr 无版 ...

  3. electron 菜单选项 - 隐藏,设置菜单

    隐藏菜单 const { app, Menu, session } = require('electron'); /*隐藏electron的菜单栏*/ Menu.setApplicationMenu( ...

  4. 泛型dotnet

    // 什么是泛型List<T> T:表示类型参数,指代任意类型 T可以是任意标识 // 编写代码时使用特殊符号替代位置类型,在实例化或使用/调用时才会进行具体类型的定义 // 特点:重用代 ...

  5. HRM平台 - 组织结构的渲染

    组织结构是一个公司的灵魂 ,多使用树型结构 : 页面格式: 渲染头部 : 头部代码: <template> <el-row type="flex" justify ...

  6. Oracle问题:alter update modify 的区别是什么?

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486480&idx=1 ...

  7. KubeSphere 部署 Zookeeper 实战教程

    前言 知识点 定级:入门级 如何利用 AI 助手辅助运维工作 单节点 Zookeeper 安装部署 集群模式 Zookeeper 安装部署 开源应用选型思想 实战服务器配置(架构 1:1 复刻小规模生 ...

  8. 基于 KubeKey 扩容 Kubernetes v1.24 Worker 节点实战

    前言 知识点 定级:入门级 KubeKey 扩容 Worker 节点 openEuler 操作系统的基本配置 Kubernets 基本命令 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不 ...

  9. AI五子棋_08 五子棋落子规则对应的价值

    AI五子棋 第八步 恭喜你到达第八步! 利用前一步得到的棋型分析结果,考察每一个可能落子的位置,给每一个可能的位置打分,将棋子落在分数最高的位置上.根据经验,我们可以总结出下面的落子规则: 1. 致胜 ...

  10. Paypal绑定招商银行 —— Paypal绑定收款银行账户的注意事项

    地址: https://code.newban.cn/446.html