Я могу считать те же строки в потоке, но я не понимаю, как заменить группу, без дополнительных итераций
, если вы собираетесь сохранитьс потоковым подходом у вас нет другого выбора, кроме как передавать по потоку через entrySet()
.
Второе, на что я хотел бы обратить внимание, это то, что вместо использования коллектора counting
было бы лучше использоватьtoList
сборщик, чтобы немного упростить жизнь, когда мы передаем по entrySet
для выполнения дальнейших операций.
т.е.
Stream.of("a", "a", "b", "b", "b", "c")
.collect(groupingBy(Function.identity(),
LinkedHashMap::new,
toList()))
.entrySet().stream()
.flatMap(e -> e.getValue().size() == 3 ? Stream.of(e.getKey().toUpperCase()) :
e.getValue().stream())
.collect(toList());
для полноты, если вы хотите сохранитьс помощью коллектора counting
вы можете:
Stream.of("a", "a", "b", "b", "b", "c")
.collect(groupingBy(Function.identity(),
LinkedHashMap::new,
counting()))
.entrySet().stream()
.flatMap(e -> e.getValue() == 3 ? Stream.of(e.getKey().toUpperCase()) :
Stream.generate(e::getKey).limit(e.getValue()))
.collect(Collectors.toList());
вы также можете заменить Stream.generate(e::getKey).limit(e.getValue())
на LongStream.range(0, e.getValue()).mapToObj(s -> e.getKey())
, если хотите ...