Reputation: 976
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
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
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