java8使用stream实现list中对象属性的合并(去重并求和)-kb88凯时官网登录

时间:2021-01-09
阅读:
免费资源网 - https://freexyz.cn/

前言

需要对一个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 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 result = merge(billsnumslist);
 system.out.println("result:"   json.tojsonstring(result, true));
}

合并

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

/**
 * 将id进行合并nums, sums 相加道回合并后的集合使用java8的流进行处理
 */
public static list merge(list list) {
  map 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 merge(list list) {
  list 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 ;
}

结果

免费资源网 - https://freexyz.cn/
返回顶部
顶部
网站地图