Как группировать по ключам потока пар - PullRequest
0 голосов
/ 21 сентября 2018

Скажите, что у меня есть следующий поток:

...
import javafx.util.Pair;
...
Pair[] testPairs = {
        new Pair<>("apple", "James"),
        new Pair<>("banana", "John"),
        new Pair<>("grapes", "Tom"),
        new Pair<>("apple", "Jenkins"),
        new Pair<>("banana", "Edward"),
        new Pair<>("grapes", "Pierre")
};

Map<String, List<String>> result1 = Arrays.stream(testPairs)...;

Map<String, String> result2 = Arrays.stream(testPairs)...;

Для result1 , я хочу сгруппировать по ключам пар и получить все соответствующие имена,Для result2 я хочу сгруппировать по ключам и получить в списке строку (предыдущего результата).

Как этого добиться, используя API Java 8 Stream?

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете сделать это следующим образом:

Map<String, List<String>> result1 = Arrays.stream(testPairs)
    .collect(Collectors.groupingBy(Pair::getS, 
        Collectors.mapping(Pair::getT, Collectors.toList())));

Map<String, String> result2 = Arrays.stream(testPairs)
    .collect(Collectors.toMap(Pair::getS, Pair::getT, (v1, v2) -> v1));

Если вы используете типы строк с массивами, вот версия с необходимыми приведениями, как указано в приведенном ниже комментарии YCF_L.

Map<String, List<String>> result1 = Arrays.stream(testPairs)
        .collect(Collectors.groupingBy(p -> (String) p.getKey(),
                Collectors.mapping(p -> (String) p.getValue(), Collectors.toList())));

Map<String, String> result2 = Arrays.stream(testPairs)
                .collect(Collectors.toMap(
                        p -> (String) p.getKey(), 
                        p -> (String) p.getValue(), 
                        (a, b) -> b)
                );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...