Подтвердить что ты не робот

Как преобразовать набор для сопоставления с набором в качестве значения в java 8?

У меня есть следующий класс:

class A {
   private String id;
   private String name;
   private String systemid;
}

Я получаю набор A и хочу преобразовать его в карту, где ключ является идентификатором системы, а значение установлено в A. (Map<String, Set<A>) Могут быть несколько экземпляров A с одинаковым системным идентификатором.

Не могу понять, как это сделать. до сих пор, но личность явно не права

Map<String, Set<A>> sysUidToAMap = mySet.stream().collect(Collectors.toMap(A::getSystemID, Function.identity()));

можете ли вы помочь?

4b9b3361

Ответ 1

Вы можете использовать groupingBy вместо toMap:

Map<String, Set<A>> sysUidToAMap =  
    mySet.stream()
         .collect(Collectors.groupingBy(A::getSystemID,
                                        Collectors.toSet()));

Ответ 2

my 2 ¢: вы можете сделать это с помощью Collectors.toMap, но он немного более подробный:

      yourSet
      .stream()
            .collect(Collectors.toMap(
                    A::getSystemId,
                    a -> {
                        Set<A> set = new HashSet<>();
                        set.add(a);
                        return set;
                    }, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }));

Ответ 3

Поскольку потоки не запрашивались специально, здесь можно сделать это только с API Map:

Map<String, Set<A>> map = new HashMap<>();
mySet.forEach(a -> map.computeIfAbsent(a.getSystemId(), k -> new HashSet<>()).add(a));