首页 文章

Java 8流分组以对象作为键的对象字段

提问于
浏览
4

我有以下类的结构(给出的例子是没有意义的,我只是为了问题目的而做的):

public class ManufacturerDto {
    private String name;
    private Boolean withConfirmation;

    //getters and setters omitted for brevity
}

public class CarDto {

    private ManufacturerDto manufacturer;

    //getters and setters omitted for brevity
}

public abstract class VehicleDto {

    private list<CarDto> cars = new ArrayList<>();

    //getters and setters omitted for brevity
}

public class EuropeanMarketCarDto extends VehicleDto {

    public Map<String, List<CarDto>> getCarManufacturerToCarsMap() {

       return this.getCarDtos()
                .stream()
                .collect(Collectors.groupingBy(e -> e.manufacturer().getName()));

        //getters and setters omitted for brevity
    }
}

在给定的场景中, groupingBy 几乎可以返回我想要的所有内容,但是我的密钥有问题 . 在 getCarManufacturerToCarsMap() 方法中,我希望将 manufacturer 对象作为键,但我甚至不确定是否可以使用 groupingBy . 我该怎么做才能返回 Map<Manufacturer, List<CarDto>> 的 Map ?

2 回答

  • 2

    如果您确实希望避免将 Map 密钥设为 String ,即 Map<String, List<CarDto>> 而是拥有 Map<Manufacturer, List<CarDto>> ,则可按以下方式分组:

    this.getCarDtos()
          .stream()
          .collect(Collectors.groupingBy(e -> e.getManufacturer()));
    

    请注意,这将要求您在 Manufacturer 类中重写 equalshashcode 方法,以定义两个给定对象具有相同名称的相等对象 .

  • 2

    你可以尝试这样的事情:

    Map<Manufacturer, List<Car>> listing = cars.stream().collect(Collectors.groupingBy(Car::getManufacturer));
    

    因此,这将由它的制造商对所有汽车进行分组,输出将是这样的:

    TOYOTA = [AURIS的AURIS params,AVIA的AVIA params],MERCEDES = [S500的S500 params ...]

    EDIT 2

    public class Main {
    
        List<Car> listOfCars = new ArrayList<>();
    
    
        public static void main(String[] args) {
        List<Car> listOfCars = new ArrayList<>();
        listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota A"));
        listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota B"));
        listOfCars.add(new Car(new Manufacturer("Jeep"), "Jeep A"));
        listOfCars.add(new Car(new Manufacturer("Mercedes"), "Mercedes C"));
        listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota C"));
        listOfCars.add(new Car(new Manufacturer("Audi"), "Audi A"));
        listOfCars.add(new Car(new Manufacturer("Toyota"), "Toyota C"));
    
    
    
     Map<String,List<Car>> listOfCarsByManufacturers = listOfCars.stream().collect(Collectors.groupingBy(d->d.getManufacturer().getName()));
    
        System.out.println(listOfCarsByManufacturers);
        }
    
    
    
    
    }
    
        public class Car {
    
        private Manufacturer manufacturer;
        private String nameOfTheCar;
    
        public Car() {
        }
    
        public Car(Manufacturer manufacturer, String nameOfTheCar) {
            this.manufacturer = manufacturer;
            this.nameOfTheCar = nameOfTheCar;
        }
    
        public Manufacturer getManufacturer() {
            return manufacturer;
        }
    
        public String getNameOfTheCar() {
            return nameOfTheCar;
        }
    
        @Override
        public String toString() {
            return "Manufacturer: " + getManufacturer() + ", name: " + getNameOfTheCar();
        }
    
    }
    
    public class Manufacturer {
    
        private String name;
    
        public Manufacturer() {
        }
    
        public Manufacturer(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return getName();
        }
    
    
    }
    

    EDIT 3:

    Map<String,List<Car>> listOfCarsByManufacturers = listOfCars.stream().collect(Collectors.groupingBy(d->d.getManufacturer().getName()));
    System.out.println(listOfCarsByManufacturers);
    

相关问题