java list 分组 统计
时间: 2023-08-23 14:06:05 浏览: 90
如果需要对List进行分组统计,可以结合使用Java 8中的stream和Collectors,具体代码如下:
假设有一个存储Order对象的List,每个Order对象有orderId、userId和price三个属性,我们要将List按照userId属性进行分组,并统计每个userId对应的订单数和订单总价:
```java
List<Order> orderList = new ArrayList<>();
// 添加Order对象到List中
...
// 按照userId属性分组,并统计订单数和订单总价
Map<Integer, OrderStats> orderStatsMap = orderList.stream()
.collect(Collectors.groupingBy(Order::getUserId,
Collectors.reducing(new OrderStats(),
order -> new OrderStats(1, order.getPrice()),
(s1, s2) -> new OrderStats(s1.getCount() + s2.getCount(), s1.getTotalPrice() + s2.getTotalPrice()))));
```
上述代码中,使用了stream()方法将List转换成流,然后使用Collectors.groupingBy()方法按照Order::getUserId分组。在Collectors.groupingBy()方法的第二个参数中,使用Collectors.reducing()方法对分组后的订单List进行统计。Collectors.reducing()方法的第一个参数为初始值,表示订单数和订单总价都为0的OrderStats对象;第二个参数为一个Function,表示将每个Order对象转换成一个OrderStats对象,其中订单数为1,订单总价为该Order对象的price属性值;第三个参数为一个BinaryOperator,表示将两个OrderStats对象合并成一个OrderStats对象,其中订单数为两个OrderStats对象的订单数之和,订单总价为两个OrderStats对象的订单总价之和。最终得到的结果是一个Map<Integer, OrderStats>,其中key为userId属性值,value为该userId对应的订单数和订单总价的统计结果。
其中,OrderStats是一个自定义的类,表示订单数和订单总价的统计结果,具体代码如下:
```java
public class OrderStats {
private int count; // 订单数
private double totalPrice; // 订单总价
public OrderStats() {
this.count = 0;
this.totalPrice = 0;
}
public OrderStats(int count, double totalPrice) {
this.count = count;
this.totalPrice = totalPrice;
}
// getter和setter方法省略
}
```
阅读全文