Что такое альтернатива switchIfEmpty в Smallrye Mutiny - PullRequest
2 голосов
/ 10 апреля 2020

В Rx Java 2 и Reactor есть switchIfEmpty подобный метод для переключения на новый поток, если в потоке тока нет элементов.

Но когда я начал использовать Minuty , я не могу найти альтернативу при преобразовании образца Quarkus для использования реактивных функций.

В настоящее время мое решение: в моем PostRepository я использую исключение, чтобы указать пост не найден.

 public Uni<Post> findById(UUID id) {
        return this.client
                .preparedQuery("SELECT * FROM posts WHERE id=$1", Tuple.of(id))
                .map(RowSet::iterator)
                .flatMap(it -> it.hasNext() ? Uni.createFrom().item(rowToPost(it.next())) : Uni.createFrom().failure(()-> new PostNotFoundException()));
    }

И поймать его в PostResource.

@Path("{id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Uni<Response> getPostById(@PathParam("id") final String id) {
        return this.posts.findById(UUID.fromString(id))
                .map(data -> ok(data).build())
                .onFailure(PostNotFoundException.class).recoverWithItem(status(Status.NOT_FOUND).build());
    }

Как вернуть Uni означает 0 или 1 элемент в PostRepository и использовать switchIfEmpty подобный метод в PostResource для построения альтернативного пути для потока?

1 Ответ

1 голос
/ 23 апреля 2020

Uni не может быть пустым в том смысле, что оно всегда содержит элемент (потенциально null).

Итак, эквивалент switchIfEmpty равен uni.onItem().ifNull().switchTo(() -> ...)

...