java8中如何将List转为Map--并对List进行分组、过滤、求和等操作呢?
下文笔者讲述list转Map,及对List进行聚合操作的相关示例分享,如下所示
Car对象为value
例以id分组,将id相同的放在一起:
实现思路: 使用stream的Collectors.toMap即可将List转换为Map 借助stream的filter,reduce,Collectors.groupingBy即可实现 过滤,求和,分组操作例:
定义一个对象
public class Car { private Integer id; private String name; private BigDecimal money; private Integer num; public Car(Integer id, String name, BigDecimal money, Integer num) { this.id = id; this.name = name; this.money = money; this.num = num; } }
初始化一个List对象,并存入相应的数值
List<Car> CarList = new ArrayList<>(); Car Car1 = new Car(1,"java265-1",new BigDecimal("8.81"),8); Car Car12 = new Car(1,"java265-2",new BigDecimal("2.45"),9); Car Car2 = new Car(2,"java265-3",new BigDecimal("3.33"),10); Car Car3 = new Car(3,"java265-4",new BigDecimal("6.78"),66); CarList.add(Car1); CarList.add(Car12); CarList.add(Car2); CarList.add(Car3);
List转Map
id为keyCar对象为value
/** * List -> Map * 注意事项: * toMap 如果集合对象有重复的key,会报错Duplicate key .... * Car1,Car12的id都为1。 * 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2 */ Map<Integer, Car> CarMap = CarList.stream().collect(Collectors.toMap(Car::getId, a -> a,(k1,k2)->k1));
分组
List里面的对象元素,使用某个属性来分组例以id分组,将id相同的放在一起:
//List 以ID分组 Map<Integer,List<Car>> Map<Integer, List<Car>> groupBy = CarList.stream().collect(Collectors.groupingBy(Car::getId));
过滤filter
从集合中过滤出来符合条件的元素//过滤出符合条件的数据 List<Car> filterList = CarList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());
求和
将集合中的数据按照某个属性求和//计算 总金额 BigDecimal totalMoney = CarList.stream().map(Car::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add); //数量求总和 int sum = CarList.stream().mapToInt(Car::getNum).sum();
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。