Как сделать сопоставление один ко многим с помощью Java лямбд и потоков? - PullRequest
0 голосов
/ 07 марта 2020

Я хочу разбить список чисел на кратные 2, 3, 5 и сохранить результат на карте. Пример вывода будет выглядеть следующим образом:

2 -> 2, 6, 10, 18 etc.
3 -> 3, 6, 9 etc.
5 -> 5, 10 etc.

Я пробовал разные способы группировки (используя Collectors.groupingBy ()) et c. в collect () ниже и каждый раз получал ошибки компиляции. Как мне это сделать?

public void groupingByDemo() {
    //Split a list of numbers into multiples of 2, 3, 5. Store the result in a Map<Integer, Set>.
    List<Integer> multipliers = Arrays.asList(2, 3, 5);
    List<Integer> nums = Arrays.asList(1, 2, 4, 6, 7, 8, 9, 10, 11, 16, 17, 25, 27);

    Map<Integer, Set> multiples = multipliers
            .stream().collect(
              //What to put here ? or should I use something else instead of collect() ?
            );
}

1 Ответ

3 голосов
/ 07 марта 2020

Вот один из способов сделать это.

    List<Integer> multipliers = Arrays.asList(2, 3, 5);
    List<Integer> nums = Arrays.asList(1, 2, 4, 6, 7, 8, 9, 10, 11, 16, 17, 25, 27);

    Map<Integer, Set<Integer>> map = multipliers.stream()
                .collect(Collectors.toMap(m -> m,
                        m-> nums.stream()
                                .filter(n -> n % m == 0)
                                .collect(Collectors.toSet())));
     map.forEach((m, n)-> System.out.println(m + " -> " + n));

Вот вывод.

2 -> [16, 2, 4, 6, 8, 10]
3 -> [6, 9, 27]
5 -> [25, 10]       
...