在最近遇到了一个需求,需要将前端数据和数据库中的数据做对比,找出两个数据集合的差,并,补,交集并对其数据完成相应操作。这个可以通过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)]