前言

在需求开发中,我们需要对一个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. SpringBoot 集成 LDAP

    LDAP协议具体是什么可以自行查看,简单来说就是单点登录的一种实现方式 LDAP只是一种协议,实现的有 openLDAP ,Microsoft active directory 等 openLDAP部 ...

  2. foobar2000 v1.6.13 汉化版(更新于2022.11.22)

    foobar2000 v1.6.13 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...

  3. Win10 LTSC 从 2019(1809) 升级到 2021(21H2) 后找回丢失的 WSL

    Win 10 LTST 2019 升级 2021 很简单,直接挂载 ISO 镜像以后,运行 setup.exe,剩下的就是耐心等待了. 升级完成后,用户信息和安装的软件基本上都在,VM15 启动的时候 ...

  4. 新建数据库 phpStudy

    官网:https://www.xp.cn/下载phpStudy : 环境配置:1. 下载MySQL8.0.12 2. 安装HeidiSQL11.0 开启 MySQL8.0.12 修改MySQL的密码: ...

  5. P1762 偶数&杨辉三角

    P1762 偶数&杨辉三角(天立OI) 解题思路 一.结论法 杨辉三角形结论 第\(n\)行有\(n\)个数. 每行奇数个数必为\(2^k\)(\(k\)不是行数) 当行数恰为\(2^k\)时 ...

  6. DOS特殊字符的转义方法

  7. TrueNAS关闭5357端口

    sockstat -4l 查看监听5357端口进程的ID. 用kill -9 PID 干掉进程.

  8. 使用netsh命令行进行网络管理

    显示网络适配器状态 netsh interface show interface 显示各个网络适配器的名称和状态 启用(禁用)网络适配器 本系列命令需要以"以管理员身份运行". 禁 ...

  9. PHP mysql 大量批量insert或update数据出错问题

    UPDATE users SET age = 30 WHERE name = 'Alice'; UPDATE users SET age = 25 WHERE name = 'Bob'; UPDATE ...

  10. vmware剪贴板共享不起作用的解决方法-银河麒麟V10服务器版

    安装了虚拟机自带的vmware tools,还是不行 试试这样: yum install open-vm-tools yum install open-vm-tools-desktop 或者: sud ...