最近在做一个项目,遇到了数据分类,和List数据分类合并处理逻辑(相同属性的去重,并把属性叠加起来),开发代码不容展示,写了一个demo方便大家理解:
新建一个实体类
@Data
public class OrderItem {
private String id;
private String goodsName;
private Integer goodsNuber;
public OrderItem(String id, String goodsName, Integer goodsNuber) {
this.id = id;
this.goodsName = goodsName;
this.goodsNuber = goodsNuber;
}
业务逻辑处理,以及注释:
public void goodsOrder() {
ArrayList<OrderItem> orderList = new ArrayList<>();
orderList.add(new OrderItem("1", "苹果", 10));
orderList.add(new OrderItem("1", "苹果", 10));
orderList.add(new OrderItem("2", "香蕉", 12));
orderList.add(new OrderItem("2", "香蕉", 18));
orderList.add(new OrderItem("3", "丑橘", 26));
orderList.add(new OrderItem("3", "丑橘", 14));
orderList.add(new OrderItem("4", "火绒果", 27));
orderList.add(new OrderItem("4", "火绒果", 23));
//这个是java8中StreamAPI的分类方法,返回的是一个Map,
Map<String, List<OrderItem>> collect = orderList.parallelStream().collect(Collectors.groupingBy(e -> (e.getId() + e.getGoodsName())));
System.out.println("StreamAPI的分类====>返回是一个Map:"+ collect);
//该Collector按分类顺序将所有输入元素收集到一个列表中,输出出来返回依然是Map collectList
Map<String, List<OrderItem>> collecorsList = orderList.parallelStream().collect(Collectors.groupingBy(e -> (e.getId() + e.getGoodsName()),Collectors.toList()));
System.out.println("StreamAPI的分类顺序====>返回是一个Map:"+ collect);
//通过java8中StreamAPI分类方法处理后,然后通过List里面对象的属性值来去重List,并把相同属性的其他属性相加,得到一个新的List
ArrayList<OrderItem> orderItemList = new ArrayList<>();
orderList.parallelStream().collect(Collectors.groupingBy(e -> (e.getId() + e.getGoodsName()),Collectors.toList())).forEach((id, transfer) -> {
transfer.stream().reduce((a, b) -> new OrderItem (a.getId(),a.getGoodsName(),a.getGoodsNuber()+b.getGoodsNuber())).ifPresent(orderItemList::add);
});
System.out.println("StreamAPI的分类相同属性的合并====>返回是新的List:"+ orderItemList);
}
控制台输出:
treamAPI的分类====>返回是一个Map:{3丑橘=[OrderItem(id=3, goodsName=丑橘, goodsNuber=26), OrderItem(id=3, goodsName=丑橘, goodsNuber=14)], 2香蕉=[OrderItem(id=2, goodsName=香蕉, goodsNuber=12), OrderItem(id=2, goodsName=香蕉, goodsNuber=18)], 1苹果=[OrderItem(id=1, goodsName=苹果, goodsNuber=10), OrderItem(id=1, goodsName=苹果, goodsNuber=10)], 4火绒果=[OrderItem(id=4, goodsName=火绒果, goodsNuber=27), OrderItem(id=4, goodsName=火绒果, goodsNuber=23)]} StreamAPI的分类顺序====>返回是一个Map:{3丑橘=[OrderItem(id=3, goodsName=丑橘, goodsNuber=26), OrderItem(id=3, goodsName=丑橘, goodsNuber=14)], 2香蕉=[OrderItem(id=2, goodsName=香蕉, goodsNuber=12), OrderItem(id=2, goodsName=香蕉, goodsNuber=18)], 1苹果=[OrderItem(id=1, goodsName=苹果, goodsNuber=10), OrderItem(id=1, goodsName=苹果, goodsNuber=10)], 4火绒果=[OrderItem(id=4, goodsName=火绒果, goodsNuber=27), OrderItem(id=4, goodsName=火绒果, goodsNuber=23)]} StreamAPI的分类相同属性的合并====>返回是新的List:[OrderItem(id=3, goodsName=丑橘, goodsNuber=40), OrderItem(id=2, goodsName=香蕉, goodsNuber=30), OrderItem(id=1, goodsName=苹果, goodsNuber=20), OrderItem(id=4, goodsName=火绒果, goodsNuber=50)]
具体的解析
和注释,在代码块中,不理解的可以留言
这里面是stream流常用的方式
public class test { public static void main(String[] args) { ArrayList<OrderItem> orderList = new ArrayList<>(); orderList.add(new OrderItem("1", "苹果", 10)); orderList.add(new OrderItem("1", "苹果", 10)); orderList.add(new OrderItem("2", "香蕉", 12)); orderList.add(new OrderItem("2", "香蕉", 18)); orderList.add(new OrderItem("3", "丑橘", 26)); orderList.add(new OrderItem("3", "丑橘", 14)); orderList.add(new OrderItem("4", "火绒果", 27)); orderList.add(new OrderItem("4", "火绒果", 23)); System.out.println(keyValueList); //分组 最常用 Map<String, List<OrderItem>> collect = orderList.parallelStream().collect(Collectors.groupingBy(e -> (e.getId() + e.getGoodsName()))); //还有sum() max() min() average()看名字就是什么 //过滤 最常用 List<OrderItem> collect1 = orderList.stream() .filter(item -> "1".equals(item.getValue())).collect(toList()); System.out.println(collect1); //去除重复元素 比较常用 List<OrderItem> collect2 = orderList.stream().distinct().collect(toList()); System.out.println(collect2); //排序 升序 List<OrderItem> collect3 = orderList.stream() .sorted((p1, p2) -> Integer.valueOf(p1.getValue()) - Integer.valueOf(p2.getValue())).collect(toList()); System.out.println(collect3); //前几 List<OrderItem> collect4 = orderList.stream().limit(2).collect(toList()); //去除前几 List<OrderItem> collect = orderList.stream().skip(2).collect(toList()); }