咖啡汪日志——stream常用的分组处理

本文介绍了Java集合框架中Stream API的使用,通过实例展示了如何根据优惠券ID进行分组,以及对交易数据进行复杂的数据处理,包括按模板ID分组、按交易值级别分组、去重、计数、取最大值、求和等操作,揭示了Java在数据处理方面的强大能力。
摘要由CSDN通过智能技术生成

根据优惠券 id, 对优惠券进行分组

List<Coupon> userUsableCoupons = findCouponsByStatus(
                userId, CouponStatus.USABLE.getCode()
        );
 // 通过模板 id , 获取可用优惠券
        Map<Integer, List<Coupon>> templateId2Coupons = userUsableCoupons.stream()
                .collect(Collectors.groupingBy(Coupon::getTemplateId));

自建分组类型进行分组

public enum ValueLevel{GGS,AGE,TTS}
Map<ValueLevel,List<Transaction>> map = transactions.stream().collect(Collectors.groupingBy(t -> {
        if(t.getValue() <= 700) return ValueLevel.AGE;
        else if (t.getValue() <=1000) return ValueLevel.GGS;
        else return ValueLevel.TTS;
    } ));
    

先分组再去重

 Map<Integer,Set<Transaction>> map1 = transactions.stream().collect(groupingBy(Transaction::getYear,toSet()));
 

先分组,再计算每组的元素个数

 Map<Integer,Long> map2 = transactions.stream().collect(groupingBy(Transaction::getYear,counting()));
 

每个子组内,交易额最大的

Map<Integer,Transaction> map3 = transactions.stream().collect(groupingBy(Transaction::getYear,collectingAndThen(maxBy(comparingInt(Transaction::getValue)),Optional::get)));

每个子组,取其交易额的总和

 Map<Integer,Integer> map4 = transactions.stream().collect(groupingBy(Transaction::getYear,summingInt(Transaction::getValue)));

每个子组,进行另外条件筛选分层映射

Map<Integer,Set<ValueLevel>> map5 = transactions.stream().collect(groupingBy(Transaction::getYear,mapping( transaction -> {
        if(transaction.getValue() <= 700) return ValueLevel.AGE;
        else if(transaction.getValue() <= 1000) return ValueLevel.GGS;
        else return ValueLevel.TTS;
    },toCollection(HashSet::new))));
    

在这里插入图片描述

Java 8中新增的Stream是一种处理集合的优雅姿势。 Stream是对集合(Collection)对象功能的增强,它能以一种声明的方式来处理数据,实现类似于SQL语句的操作。Stream不会改变原有的数据结构,它会生成一个新的Stream,同时支持并行化操作。 Stream的核心思想是将数据看作是流,而流上可以进行各种操作,比如过滤、排序、映射等。这样可以将数据处理过程变得非常简洁和灵活。 下面是一些Stream常用操作: 1. filter:过滤符合条件的元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().filter(i -> i % 2 == 0).forEach(System.out::println); //输出2, 4 ``` 2. map:将元素转换成另一种类型 ``` List<String> list = Arrays.asList("apple", "banana", "orange"); list.stream().map(s -> s.toUpperCase()).forEach(System.out::println); //输出APPLE, BANANA, ORANGE ``` 3. sorted:对元素进行排序 ``` List<Integer> list = Arrays.asList(5, 2, 1, 4, 3); list.stream().sorted().forEach(System.out::println); //输出1, 2, 3, 4, 5 ``` 4. distinct:去重 ``` List<Integer> list = Arrays.asList(1, 2, 3, 2, 1); list.stream().distinct().forEach(System.out::println); //输出1, 2, 3 ``` 5. limit:限制元素个数 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().limit(3).forEach(System.out::println); //输出1, 2, 3 ``` 6. skip:跳过元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().skip(2).forEach(System.out::println); //输出3, 4, 5 ``` 7. reduce:对元素进行聚合操作 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream().reduce(0, (a, b) -> a + b); System.out.println(sum); //输出15 ``` Stream的操作可以组合起来形成一个流水线,每个操作都会返回一个新的Stream对象,这样就可以形成一个操作序列。最后调用终止操作(如forEach、findAny等)才会触发所有中间操作的执行。 使用Stream处理集合的代码通常比使用传统的循环更简洁,同时也更易于并行化处理,提高了程序的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值