java8中StreamAPI的分类方法,以及list分类合并方法

最近在做一个项目,遇到了数据分类,和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());

    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值