Stream去除重复并求和

Steam默认提供了distinct()方法groupbying()去重复,

1.但是distinct()方法只能去除List中重复的对象,不能对根据对象中某个属性相同了去重复。

比如List<Person>,我想去除名字重复的人,然后统计年龄总和。Steam提供的distinct()方法是实现不了的。

2.但是groupbying一般只是分组,如果要实现同时去重并求和,该方法实现不了。

如何实现去除重复并且求和呢?

此处以统计薪资总和为例

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		Person2 p1 = new Person2("张三", new BigDecimal("10.0"));
		Person2 p2 = new Person2("王五", new BigDecimal("10.0"));
		Person2 p3 = new Person2("张三", new BigDecimal("10.0"));
		Person2 p4 = new Person2("李明", new BigDecimal("10.0"));
		Person2 p5 = new Person2("李明", new BigDecimal("10.0"));
		/**
		 * 求薪资总和,名字相同的只加一次
		 */
		List<Person2> pList = new ArrayList<Person2>();
		pList.add(p1);
		pList.add(p2);
		pList.add(p3);
		pList.add(p4);
		pList.add(p5);

		StringBuilder dealBankNumber = new StringBuilder();
		BigDecimal sum = pList.stream().filter(v -> {
			boolean flag = !dealBankNumber.toString().contains(v.getName());
			dealBankNumber.append("_").append(v.getName());
			return flag;
		}).map(Person2::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
		System.out.println(sum);
	}
}

class Person2 {
	private String name;// 姓名
	private BigDecimal salary;// 工资

	public Person2(String name, BigDecimal salary) {
		this.salary = salary;
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public BigDecimal getSalary() {
		return salary;
	}

	public void setSalary(BigDecimal salary) {
		this.salary = salary;
	}

}

    原文作者:Java仗剑走天涯
    原文地址: https://blog.csdn.net/baidu_37107022/article/details/79393462
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞