Java 8 stream groupingBy поле объекта с объектом в качестве ключа - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующая структура классов (данный пример не имеет смысла, я сделал это только для целей вопроса):

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

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Если вы действительно хотите избежать использования ключа карты в виде String, т. Е. Map<String, List<CarDto>>, и вместо этого иметь Map<Manufacturer, List<CarDto>>, вы можете сгруппировать следующим образом:

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

Обратите внимание, что для этого потребуетсяпереопределить метод equals и hashcode в вашем классе Manufacturer, определяя, что два заданных объекта равны, если они имеют одинаковое имя.

0 голосов
/ 09 декабря 2018

Вы можете попробовать что-то вроде этого:

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

Таким образом, все группы будут сгруппированы по производителям, результат будет примерно таким:

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

РЕДАКТИРОВАТЬ 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();
    }


}

РЕДАКТИРОВАТЬ 3:

Map<String,List<Car>> listOfCarsByManufacturers = listOfCars.stream().collect(Collectors.groupingBy(d->d.getManufacturer().getName()));
System.out.println(listOfCarsByManufacturers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...