欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java8使用stream实现list中对象属性的合并(去重并求和)

程序员文章站 2022-06-19 09:40:04
前言需要对一个list中的对象进行唯一值属性去重,属性求和,对象假设为billsnums,有id、nums、sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份。例如说...

前言

需要对一个list中的对象进行唯一值属性去重,属性求和,对象假设为billsnums,有id、nums、sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份。
例如说:(“s1”, 1, 1),(“s1”,2,3),(“s2”,4,4), 求和并去重的话,就是(“s1”, 3, 4),(“s2”,4,4)

对象与属性

class billsnums {
 private string id;
 private int nums;
 private int sums;
 
 public string getid() {
  return id;
 }
 public void setid(string id) {
  this.id = id;
 }
 public int getnums() {
  return nums;
 }
 public void setnums(int nums) {
  this.nums = nums;
 }
 public int getsums() {
  return sums;
 }
 public void setsums(int sums) {
  this.sums = sums;
 }
}

数据

public static void main(string[] args) {
 
 list<billsnums> billsnumslist = new arraylist<>();
 billsnums billsnums = new billsnums();
 billsnums.setid("1001");
 billsnums.setnums(2);
 billsnums.setsums(100);
 billsnumslist.add(billsnums);
 
 billsnums billsnums2 = new billsnums();
 billsnums2.setid("1001");
 billsnums2.setnums(3);
 billsnums2.setsums(100);
 billsnumslist.add(billsnums2);
 
 list<billsnums> result = merge(billsnumslist);
 system.out.println("result:" + json.tojsonstring(result, true));
}

合并

法一:list做循环求和,去重

/**
 * 将id进行合并nums, sums 相加道回合并后的集合使用java8的流进行处理
 */
public static list<billsnums> merge(list<billsnums> list) {
  map<string, billsnums> map = new hashmap<>();
  list.stream()
   .foreach(billsnums -> {
    billsnums last = map.get(billsnums.getid());
    if(null != last){
     billsnums.setsums(billsnums.getsums() + last.getsums());
     billsnums.setnums(billsnums.getnums() + last.getnums());
     map.put(billsnums.getid(), billsnums );
    }else{
     map.put(billsnums.getid(), billsnums);
    }
   });
  return map.values().stream().collect(collectors.tolist());
  
}

法二:法一的升级版

/**
 * 将id进行合并nums, sums 相加道回合并后的集合使用java8的流进行处理
 */
public static list<billsnums> merge(list<billsnums> list) {
  list<billsnums> result = list.stream()
  // 表示id为key, 接着如果有重复的,那么从billsnums对象o1与o2中筛选出一个,这里选择o1,
  // 并把id重复,需要将nums和sums与o1进行合并的o2, 赋值给o1,最后返回o1
  .collect(collectors.tomap(billsnums::getid, a -> a, (o1,o2)-> {
   o1.setnums(o1.getnums() + o2.getnums());
   o1.setsums(o1.getsums() + o2.getsums());
   return o1;
  })).values().stream().collect(collectors.tolist());
  return result ;
}

结果

Java8使用stream实现list中对象属性的合并(去重并求和)

到此这篇关于java8使用stream实现list中对象属性的合并(去重并求和)的文章就介绍到这了,更多相关java8实现list中对象属性的合并内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!