user3529850
user3529850

Reputation: 976

Java 8 stream groupingBy object field with object as a key

I have the following structure of classes (given example is meaningless, I've made it just for the question purposes):

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
    }
}

In the given scenario, groupingBy returns pretty much everything I want, but I have a problem with the key. In getCarManufacturerToCarsMap() method I would like to have a manufacturer object as a key but I am not even sure if that is possible using groupingBy. What can I do, to return a map of Map<Manufacturer, List<CarDto>> ?

Upvotes: 4

Views: 8395

Answers (2)

Ousmane D.
Ousmane D.

Reputation: 56413

If you actually want to avoid having the map key as a String i.e. Map<String, List<CarDto>> and instead have a Map<Manufacturer, List<CarDto>> you can group by as follows:

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

Note that this would require you to override equals and hashcode method in your Manufacturer class defining that two given objects are equal if they have the same name.

Upvotes: 5

MS90
MS90

Reputation: 1249

You could try something like this:

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

So, this will group all cars by it's manufacturers, ouput would be something like:

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

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);

Upvotes: 2

Related Questions