Допустим, у меня есть метод findAll , который возвращает Flux<Song>
из ReactiveMongoRepository<Song, String>
.
Ниже у меня есть традиционный java потоковый подход, чтобы найти x с наибольшим количеством голосов песни, которые предлагает @Naman:
return songRepository.findAll()
.collect(Collectors.toMap(Function.identity(), this::getSumOfVotes))
.entrySet().stream() --entrySet method is not recognized by IntelliJ
.sorted(Map.Entry.<Song,Integer>comparingByValue().reversed())
.limit(numberOfTopSongs)
.collect(Collectors.toMap(e -> e.getKey().getId(), Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new));
Приведенное выше решение работает для Iterable
, Set
и List
, но проблема возникает, когда я притворяюсь, что вызываю метод entrySet
на Mono<Map<Song, Integer>>
. Это мое первое погружение вглубь Web Flux
, и поэтому я немного запутался, почему метод entrySet
недоступен для типа Mono
.
Я нашел такой фрагмент кода:
Mono<Map<ByteBuffer, ByteBuffer>> serializedMap = Flux.fromIterable(() -> map.entrySet().iterator())
.collectMap(entry -> rawKey(entry.getKey()), entry -> rawValue(entry.getValue()));
но я стараюсь не перепаковывать мои:
songRepository.findAll()
.collect(Collectors.toMap(Function.identity(), this::getSumOfVotes))
в Flux.fromIterable
снова.
Буду благодарен за предложения о том, что я делаю неправильно или советы по как пропустить это препятствие.