Преобразовать List <E> в Map <String, List <String>> с использованием потоков java 8

Мне нужна помощь в преобразовании списка объектов в Map<String, List<String>>.

class Person {   
    private String name;    
    private int age;
}

У меня есть List<Person>, и я хочу собрать Map<int, List<String>>, ключ которого - возраст, а значение - список имен лиц того же возраста.

Я пробовал в этих строках, но не получилось

persons.stream().collect(Collectors.groupingBy(p -> p.getAge()), );
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
540
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте эту перегрузку groupingBy, которая принимает нисходящий коллектор:

Map<Integer, List<String>> map = persons.stream()
        .collect(Collectors.groupingBy(Person::getAge,
                Collectors.mapping(Person::getName, Collectors.toList())));

Если целью этого является обеспечение быстрого поиска, думали ли вы об использовании индексированной коллекции, такой как хранилище данных:

https://github.com/jparams/data-store

Вы можете сделать что-то вроде:

Store<Person> store = new MemoryStore<Person>();
store.index("name", Person::getName);
store.addAll(listOfPeople); // populate your store with data
Person personFound = person.get("name", "bob");

Вы можете использовать несколько индексов для одних и тех же данных. Вы даже можете создавать индексы без учета регистра и т. д.

Другие вопросы по теме