You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8如何将Car列表按make字段转为Map<String, List<Car>>

使用Java 8 Stream/Lambda快速实现按make分组的Map

别自己写分组函数啦!Java 8的Stream API早就给你准备好了开箱即用的方案,一行代码就能搞定需求,简洁又优雅。

核心实现思路

你要的Map<String, List<Car>>,本质就是按Car的make字段做分组,Stream里的Collectors.groupingBy()就是专门干这个的——它会根据你指定的分类规则,自动把列表元素归类到对应的键下,完美匹配你的需求。

完整代码示例

首先确认你的Car类要有getMake()方法(方法引用需要用到它),然后直接用Stream操作完成转换:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 你的Car类定义(补充getter方法)
public class Car {
    private String make;
    private String model;
    private String year;
    private String price;

    // 构造函数
    public Car(String make, String model, String year, String price) {
        this.make = make;
        this.model = model;
        this.year = year;
        this.price = price;
    }

    // 关键:必须有getMake方法用于分组提取键
    public String getMake() {
        return make;
    }

    // 其他getter按需添加
    public String getModel() { return model; }
    public String getYear() { return year; }
    public String getPrice() { return price; }
}

// 分组逻辑示例
public class CarGroupingDemo {
    public static void main(String[] args) {
        // 模拟你的Car列表
        List<Car> cars = List.of(
            new Car("Toyota", "Camry", "2023", "25000"),
            new Car("Toyota", "Corolla", "2022", "20000"),
            new Car("Honda", "Civic", "2023", "22000"),
            new Car("Honda", "Accord", "2022", "24000")
        );

        // 核心一行代码完成转换!
        Map<String, List<Car>> carsGroupedByMake = cars.stream()
            .collect(Collectors.groupingBy(Car::getMake));

        // 测试输出分组结果
        carsGroupedByMake.forEach((brand, carList) -> {
            System.out.println("品牌:" + brand);
            carList.forEach(car -> System.out.println("  车型:" + car.getModel()));
        });
    }
}

额外实用扩展

  • 如果想指定分组后List的类型(比如用LinkedList而非默认的ArrayList),可以用重载版的groupingBy:
    Map<String, List<Car>> carsByMake = cars.stream()
        .collect(Collectors.groupingBy(Car::getMake, Collectors.toCollection(LinkedList::new)));
    
  • 若列表中存在make为null或空字符串的Car,可提前过滤避免异常:
    Map<String, List<Car>> carsByMake = cars.stream()
        .filter(car -> car.getMake() != null && !car.getMake().isBlank())
        .collect(Collectors.groupingBy(Car::getMake));
    

内容的提问来源于stack exchange,提问作者sophist_pt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:56:34