Collectors.groupingBy для необязательного внутреннего поля - PullRequest
1 голос
/ 26 марта 2019

Я бы хотел отобразить поток Stream<Car> на карту, например Map<String, List<Car<StudentInGroup>>>, где Car класс такой:

public class Car<T> {
    Optional<T> studentInGroup;
    public Car()
    {  
    }

    public Optional<T> getStudentInGroup() {
        return studentInGroup;
    }

    public void setStudentInGroup(T studentInGroup) {
        this.studentInGroup=Optional.of(studentInGroup);
    }
}

, а StudentInGroup -

public class StudentInGroup {
    private String name;
    private boolean isGirl;
    private int age;
}

Итак, я хотел бы построить карту на основе поля имени StudenInGroup, это Optional<StudentInGroup> внутри автомобиля не Optional.empty(), в то время как я хотел бы заменить его на "none", еслив определенном коте поле studentIngroup равно Optional.empty().

Map<String, List<Car<StudentInGroup>>> stringStudentInGroupMap38= studentInGroupStreamSupplier.get().map((StudentInGroup studentInGroup)->{Car<StudentInGroup> car=new Car<StudentInGroup>();car.setStudentInGroup(studentInGroup);return car;}).collect(Collectors.groupingBy(car->car.getStudentInGroup().orElseGet(... do something with student there).getName())

Возможное решение состоит в том, чтобы создать «none with StudentInGroup», в котором getName вернет требуемые данные, хотя это не похоже направильный подход.однако <я не нашел способа сохранить исходный <code>Stream<Car> без сопоставления его с некоторыми другими потоками и принудительной группировки в Car.StudentInGroup.Name или «none», если Optional<StudenInGroup> пусто.Любые предложения, чтобы код был понятным и читабельным, приветствуются!

1 Ответ

3 голосов
/ 27 марта 2019

Просто используйте groupingBy() коллектор и сопоставьте Optional, чтобы получить ключ:

Map<String, List<Car<StudentInGroup>>> byName = cars.stream()
        .collect(Collectors.groupingBy(
                car -> car.getStudentInGroup()
                        .map(s -> s.getName())
                        .orElse("none")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...