it-roy-ru.com

Группировка потоков Java 8

У меня есть List<Map<String, String>> каждый элемент в списке, например, карта

companyName - IBM
firstName - James
country - USA
...

Я хотел бы создать Map<String, List<String>>, где он сопоставляет companyName со списком firstName Например, 

IBM -> James, Mark
ATT -> Henry, Robert..


private Map<String,List<String>> groupByCompanyName(List<Map<String, String>> list) {
    return list.stream().collect(Collectors.groupingBy(item->item.get("companyName")));
}

но это создаст Map<String, List<Map<String, String>> (отображение comanyName в список карт)

как создать Map<String, List<String>>?

18
Omer

Не проверял, но что-то вроде этого должно работать:

Map<String, List<String>> namesByCompany
    = list.stream()
          .collect(Collectors.groupingBy(item->item.get("companyName"),
                   Collectors.mapping(item->item.get("firstName"), Collectors.toList())));
30
Eran

Вы можете использовать форму: 

groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)

то есть укажите значения из карты в нисходящем направлении, которые будут приняты в качестве списка. В документации есть хороший пример ( здесь ).

downstream что-то вроде - mapping(item->item.get(<name>), toList())

5
nitishagar

Метод groupingBy выдает карту, значения которой являются списками. Если вы хотите каким-то образом обрабатывать эти списки, укажите «нисходящий коллектор» В вашем случае вы не хотите использовать List в качестве значения, поэтому вам нужно предоставить нисходящий коллектор. 

Чтобы манипулировать картой, вы можете использовать статическое отображение методов в файле Collectors:

Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
                           Collector<? super U, A, R> downstream)

Он в основном генерирует коллектор, применяя функцию к последующим результатам и передает функцию другому коллектору. 

Collectors.mapping(item->item.get("firstName"), Collectors.toList())

Это вернет нижестоящий коллектор, который достигнет того, что вы хотите.

0
Davidw