Преобразовать List<> в Map с помощью стримов
Есть класс Person
public Class Person{
private String name;
public Person(String name){
this.name = name;
}
//getter
}
Есть List <Person
Нужно создать Map<String, Integer> где key это имя из класса Person, а value это количество одинаковых имён. Хочу узнать как это сделать с помощью стримов.
аля list.stream().collect(Collectors.toMap(...))
циклами это не проблема
Ответы (1 шт):
Достаточно открыть документацию метода Collectors.toMap() и всё станет ясно (почему было не сделать этого самому?:)).
Итак, помимо варианта с 2 аргументами:
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper)
Collectors.toMap имеет ещё и вариант для разрешения конфликтов в случае дубликатов ключей:
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
тогда для решения задачи достаточно лишь понять, что при первой встрече имени количество имён = 1, при повторной встрече того же имени (то есть при коллизии ключей) значение должно увеличиваться на 1, тогда получим следующие функции (лямбды) для valueMapper и mergeFunction:
person -> 1
(oldValue, newValue) -> oldValue + 1
Для keyMapper это всё так же просто получение имени:
Person::getName
Собрать это всё вместе надеюсь сможете сами, а то пока вопрос выглядит как учебное задание :D