Как вызвать метод entrySet для Mono > - PullRequest
0 голосов
/ 26 февраля 2020

Допустим, у меня есть метод 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 снова.

Буду благодарен за предложения о том, что я делаю неправильно или советы по как пропустить это препятствие.

1 Ответ

0 голосов
/ 26 февраля 2020

Это Map<Song, Integer>, который имеет entrySet метод; если вы хотите применить какое-либо преобразование к содержимому Mono, используйте map:

Mono<Map<Song, Integer>> songs = ...;
Mono<Set<Map.Entry<Song, Integer>> = songs.map(Map::entrySet);

Обратите внимание, что map является очень распространенным именем для такого метода, это доступно по Flux, Stream, et c.

...