Вы сопоставляете экземпляры Map.Entry
с номерами Set<Long>
, что подразумевает отказ от отслеживания ключей исходной карты, что делает невозможным их сбор на новую карту с теми же ключами.
Первый вариант для отображения Map.Entry<Long, List<MyClass>>
экземпляров в Map.Entry<Long, Set<Long>>
экземпляров, а затем собирать записи на новую карту:
Map<Long, Set<Long>> result=
myFirstMap.entrySet().stream()
.map(e -> new AbstractMap.SimpleImmutableEntry<>(e.getKey(),
e.getValue().stream().map(MyClass::getId).collect(Collectors.toSet())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Альтернативой является плавить шаг map
и collect
в один, чтобы сделать преобразование прямо в функции стоимости, представленной toMap
коллектору:
Map<Long, Set<Long>> result=
myFirstMap.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream().map(MyClass::getId).collect(Collectors.toSet())));
Таким образом, вы избежите создания новых Map.Entry
экземпляров и получить однако более сжатый код, однако, обладает гибкостью, поскольку вы не можете связать дополнительные потоковые операции между ними.
Ваша правка аннулирует ответы, здесь уже целый год. Пожалуйста, не делай этого. – shmosel