java8中如何将List转为Map--并对List进行分组、过滤、求和等操作呢?

书欣 Java经验 发布时间:2022-10-19 21:02:32 阅读数:5026 1
下文笔者讲述list转Map,及对List进行聚合操作的相关示例分享,如下所示
实现思路:
    使用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为key
Car对象为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();
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202210/16661846264672.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者