您的位置:首页 > 其它

Stream去除重复并求和

2018-02-27 21:27 471 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: