一、概述
有这样一个需求,在一个list集合中的对象有相同的name,我需要把相同name的对象的total进行汇总计算,并且根据total倒序排序。使用java stream来实现这个需求,这里做一个记录,希望对有需求的同学提供帮助。
二、根据对象指定字段分组排序
使用java stream 计算的过程如下图:
image.png
下面是实现的代码示例:
/**
* 定义一个对象,这里使用了lombok的注解
*/
@Data
@Accessors(chain = true)
class Good {
private String name;
private Integer total;
}
public class Test4 {
public static void main(String[] args) {
List<Good> list = new ArrayList<>();
// 创建几个对象放在list集合中
list.add(new Good().setName("xiaomi").setTotal(2));
list.add(new Good().setName("huawei").setTotal(2));
list.add(new Good().setName("apple").setTotal(2));
list.add(new Good().setName("xiaomi").setTotal(2));
List<Good> collect1 = list.stream()
// 根据name进行分组
.collect(Collectors.groupingBy(Good::getName))
.entrySet()
.stream()
.map(entry -> {
String key = entry.getKey();
List<Good> value = entry.getValue();
Integer sum = value.stream().mapToInt(Good::getTotal).sum();
return new Good().setName(key).setTotal(sum);
})
// 根据total倒序排序
.sorted(Comparator.comparing(Good::getTotal).reversed())
.collect(Collectors.toList());
System.out.println(collect1.toString());
}
}
输出结果如下:
image.png
网友评论