Java8 中通过 Stream 对列表分组的groupBy 的使用

对List进行分组(java8的Stream 分组的groupBy 的使用)

最近在做一个功能:对一个接口接收的List数据进行校验,同一个订单里的一个产品id只能添加一次。本来想是在入库的时候通过SQL语句进行处理的。但是由于这个数据接口之前同事写了很多的校验,是在是又*又长。在度娘上查一下,发现了JAVA8 可以通过Stream对List进行处理(这里主要是关于分组的);

List<Object> newList = objectList.stream().map(Object::getVar).collect(Collectors.toList());
Order order1 = new Order();
order1.setOrderId("123")Order1.setGoodsId("S1");
Order1.setSales(100);

Order order2 = new Order();
order2.setOrderId("123")Order2.setGoodsId("S2");
Order1.setSales(200);

Order order2 = new Order();
order2.setOrderId("1234")Order2.setGoodsId("S3");
Order1.setSales(300);

List<Order> list =  new ArrayList();
List.add(order1);
List.add(order2);
List.add(order3);

Map<String,List<Order>> map = list.stream().collect(Collectors.groupingBy(ord -> ord.getOrderId));
//或 Map<String,List<Order>> map = list.stream().collect(Collectors.groupingBy(Order::getOrderId));

如果需要分组前进行判断,可以加个过滤;

Map<String,List<Order>> map = list.stream().filter(ord -> ord.getOrderId!= null)
.collect(Collectors.groupingBy(h -> h.getOrderID));

需要通过两个字段进行分组,groupingBy 里面加了两个字段;

Map<String,List<Order>> map = list.stream().collect(Collectors.groupingBy(ord -> ord.getOrderId+;+ ord.getOrderGoodsId()));

分组是按照groupingBy里面拼接的字段进行分组的,我这里加上";"主要是为了区分订单号和产品号;
上面是groupingBy分组器最多见的一个用法,下面简单介绍一下其余用法:
统计每一个分组的count

/**
 * 使用java8 stream groupingBy操做,按城市分组list统计count
 */
Map<String,Long> map = list.stream().collect(Collectors.groupingBy(Order::getOrderId,  Collectors.counting()));

统计分组平均值

/**
 * 使用java8 stream groupingBy操做,按城市分组list并计算分组销售平均值
 */
 Map<String,Long> map = list.stream().collect(Collectors.groupingBy(Order::getOrderId,  Collectors.averagingInt(Order::getSales)));

统计分组总值

/**
 * 使用java8 stream groupingBy操做,按城市分组list并计算分组销售总值
 */
 Map<String,Long> map = list.stream().collect(Collectors.groupingBy(Order::getOrderId,  Collectors.summingLong(Order::getSales)));

 //对Map按照分组销售总值逆序排序
 Map<String, Long> finalMap = new LinkedHashMap<>();
 map.entrySet().stream()
         .sorted(Map.Entry.<String, Long>comparingByValue()
                 .reversed()).forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));

相关链接
Java8 中通过 Stream 对列表进行去重的方法

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用Java 8的Stream API和Collectors.groupingBy()方法实现MySQL的group by功能。假设我们有一个包含以下数据的MySQL表: ``` +----+-------+-------+ | id | name | score | +----+-------+-------+ | 1 | Alice | 80 | | 2 | Bob | 75 | | 3 | Alice | 90 | | 4 | Bob | 85 | | 5 | Alice | 95 | +----+-------+-------+ ``` 要按name分组并计算每个组的平均分数,可以使用以下代码: ```java import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<Student> students = Stream.of( new Student(1, "Alice", 80), new Student(2, "Bob", 75), new Student(3, "Alice", 90), new Student(4, "Bob", 85), new Student(5, "Alice", 95) ); Map<String, Double> avgScoresByName = students .collect(Collectors.groupingBy(Student::getName, Collectors.averagingDouble(Student::getScore))); System.out.println(avgScoresByName); } } class Student { private int id; private String name; private int score; public Student(int id, String name, int score) { this.id = id; this.name = name; this.score = score; } public int getId() { return id; } public String getName() { return name; } public int getScore() { return score; } } ``` 输出结果为: ``` {Alice=88.33333333333333, Bob=80.0} ``` 其,Collectors.groupingBy()方法按照学生的name属性分组,Collectors.averagingDouble()方法计算每个组的平均分数,并返回一个Map<String, Double>对象,其键为name,值为平均分数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

redstone618

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

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

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

打赏作者

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

抵扣说明:

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

余额充值