前言
需要对一个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) { listbillsnumslist = 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 listmerge(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 listmerge(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 ; }
结果