Один из моих коллег по работе недавно познакомил меня с оператором расширения типов Project Reactor, и в этом посте я хочу рассказать о нескольких способах его использования.
Развертывание разбитого на страницы результата
Рассмотрим репозиторий на основе Spring Data для модели с названием City:
|
1
2
3
4
5
|
import org.springframework.data.jpa.repository.JpaRepository;import samples.geo.domain.City;public interface CityRepo extends JpaRepository<City, Long> {} |
Этот репозиторий предоставляет способ получения разбитого на страницы результата по следующим строкам:
|
1
|
cityRepo.findAll(PageRequest.of(0, 5)) |
Теперь, если бы мне пришлось развернуть несколько страниц в результате, способ сделать это был бы следующим видом цикла:
|
1
2
3
4
5
6
|
var pageable: Pageable = PageRequest.of(0, 5)do { var page: Page<City> = cityRepo.findAll(pageable) page.content.forEach { city -> LOGGER.info("City $city") } pageable = page.nextPageable()} while (page.hasNext()) |
Эквивалентное развертывание разбитого на страницы результата можно выполнить с помощью оператора расширения Reactor следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
val result: Flux<City> = Mono .fromSupplier { cityRepo.findAll(PageRequest.of(0, 5)) } .expand { page -> if (page.hasNext()) Mono.fromSupplier { cityRepo.findAll(page.nextPageable()) } else Mono.empty() } .flatMap { page -> Flux.fromIterable(page.content) }result.subscribe( { page -> LOGGER.info("City ${page}") }, { t -> t.printStackTrace() }) |
Здесь первая страница результатов расширяется до второй страницы, вторая страница — до третьей страницы и т. Д. До тех пор, пока не будет страниц для извлечения.
Обход дерева
Рассмотрим узел в древовидной структуре, представленной следующей моделью:
|
1
2
3
4
|
data class Node( val id: String, val nodeRefs: List<String>,) |
Пример данных, который выглядит следующим образом:

может быть пройден с помощью вызова, который выглядит следующим образом:
|
1
2
3
4
5
6
|
val rootMono: Mono<Node> = nodeService.getNode("1")val expanded: Flux<Node> = rootMono.expand { node -> Flux.fromIterable(node.childRefs) .flatMap { nodeRef -> nodeService.getNode(nodeRef) }}expanded.subscribe { node -> println(node) } |
Это расширение в ширину, вывод выглядит так:
|
1
2
3
4
5
6
7
|
Node-1Node-1-1Node-1-2Node-1-1-1Node-1-1-2Node-1-2-1Node-1-2-2 |
Вариант expandDeep будет проходить в глубину
|
Смотрите оригинальную статью здесь: Project Reactor, разверните метод Мнения, высказанные участниками Java Code Geeks, являются их собственными. |