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
相关产品推荐
相关产品推荐

