группирование массива строк по их первому значению с использованием потока Java 8 - PullRequest
0 голосов
/ 25 мая 2018

У меня есть список массивов, содержащих две строки:

List<String[]> pets = {["Alice", "dog"], ["Bob", "horse"], ["Alice", "cat"], ["Bob", "cat"]}

Я хочу превратить их в карту из строки в список строк, как показано ниже:

Map<String, List<String>>> pets = Map where
"Alice" maps to the List {"dog, "cat"}
"Bob" maps to the List {"horse", "cat"}

т.е. мы берем первый элемент массива и группируем все элементы, где первые элементы равны друг другу.Обязательным способом решения этой проблемы было бы зацикливание элементов и постепенное построение карты.Есть ли способ сделать это с потоками Java, то есть с помощью Collector или уменьшить?

1 Ответ

0 голосов
/ 25 мая 2018

Конечно, вы можете!

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

 Map<String, List<String>> resultSet = pets.stream()
                .collect(groupingBy(array -> array[0],
                        collectingAndThen(mapping(e -> Arrays.copyOfRange(e, 1, e.length),
                                toList()),
                                f -> f.stream().flatMap(Arrays::stream)
                                .collect(toList()))));

или:

 Map<String, List<String>> resultSet = pets.stream()
                .collect(groupingBy(array -> array[0],
                flatMapping(e -> Arrays.stream(Arrays.copyOfRange(e, 1, e.length)),
                                    toList())));

Обратите внимание, что в этом решении используется коллектор flatMapping, который доступен только с JDK-9.

...