在最近遇到了一个需求,需要将前端数据和数据库中的数据做对比,找出两个数据集合的差,并,补,交集并对其数据完成相应操作。这个可以通过stream完成(以下是通过goodsId属性完成交集和差集的计算):
数据准备
import lombok.Data; @Data public class GoodsSellPrice { private String goodsName; private Long goodsId; }
List<GoodsSellPrice> list1 = new ArrayList<>(); GoodsSellPrice goodsSellPrice1 = new GoodsSellPrice(); goodsSellPrice1.setGoodsId(1000L); goodsSellPrice1.setGoodsName("眼镜0"); list1.add(goodsSellPrice1); GoodsSellPrice goodsSellPrice2 = new GoodsSellPrice(); goodsSellPrice2.setGoodsId(1001L); goodsSellPrice2.setGoodsName("眼镜1"); list1.add(goodsSellPrice2); GoodsSellPrice goodsSellPrice3 = new GoodsSellPrice(); goodsSellPrice3.setGoodsId(1002L); goodsSellPrice3.setGoodsName("眼镜2"); list1.add(goodsSellPrice3); GoodsSellPrice goodsSellPrice4 = new GoodsSellPrice(); goodsSellPrice4.setGoodsId(1003L); goodsSellPrice4.setGoodsName("眼镜3"); list1.add(goodsSellPrice4); List<GoodsSellPrice> list2 = new ArrayList<>(); GoodsSellPrice goodsSellPrice5 = new GoodsSellPrice(); goodsSellPrice5.setGoodsId(1000L); goodsSellPrice5.setGoodsName("眼镜10"); list2.add(goodsSellPrice5); GoodsSellPrice goodsSellPrice6 = new GoodsSellPrice(); goodsSellPrice6.setGoodsId(1007L); goodsSellPrice6.setGoodsName("眼镜5"); list2.add(goodsSellPrice6);
差集
把哪个集合放在最前面就是取哪个集合的差集:
List<GoodsSellPrice> delGoodsSellPrices = list1.stream().filter(item -> !list2.stream().map(e -> e.getGoodsId()).collect( Collectors.toList()).contains(item.getGoodsId())).collect(Collectors.toList());
List<GoodsSellPrice> addGoodsSellPrices = list2.stream().filter(item -> !list1.stream().map(e -> e.getGoodsId()).collect( Collectors.toList()).contains(item.getGoodsId())).collect(Collectors.toList());
交集
List<GoodsSellPrice> updateGoodsSellPrices = list2.stream().filter(item -> list1.stream().map(e -> e.getGoodsId()).collect( Collectors.toList()).contains(item.getGoodsId())).collect(Collectors.toList());
结果
[GoodsSellPrice(goodsName=眼镜1, goodsId=1001), GoodsSellPrice(goodsName=眼镜2, goodsId=1002), GoodsSellPrice(goodsName=眼镜3, goodsId=1003)] [GoodsSellPrice(goodsName=眼镜5, goodsId=1007)] [GoodsSellPrice(goodsName=眼镜10, goodsId=1000)]