es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Proyecto Reactor: Obtener el tamaño de la lista contenida dentro de un Mono.

Estoy tratando de hacer algo de nuevo aquí en el proyecto reactor que estoy seguro de que es súper sencillo para cualquiera de ustedes, gurús del proyecto reactor que estén ahí fuera!
He estado buscando y rascándome con esto por un tiempo ahora, y siento que una vez más me estoy estrellando con esto.

Todo lo que estoy tratando de hacer es determinar si una lista de objetos contenida dentro de un Mono está vacía o no.

Esto es lo que tengo hasta ahora:

private Mono<boolean> isLastCardForAccount(String accountId) {
    return cardService.getAccountCards(accountId)
        .hasElement();
}

Estoy pensando que lo anterior podría funcionar, pero estoy teniendo dificultades para averiguar cómo extraer/acceder al ‘Boolean’ contenido dentro del Mono devuelto. ¿Creo que tengo que usar ‘subscribe’ de alguna manera, verdad?
He estado jugando con esto por un tiempo, pero todavía no hay suerte.

Así se define ‘getAccountCards’:

public Mono<><card>> getAccountCards(final String accountId) {
    return cardCrudRepository.getCardsByAccountId(accountId)
        .collectList();
}

Desde CardCrudRepository:

// @Query("SELECT * FROM card WHERE account_id = :accountId") <- No estoy seguro si necesito esto
Flux<card> getCardsByAccountId(String accountId);

Y por último, así es como estoy usando ‘isLastCardForAccount’:

public Mono<void> updateCardStatus(String accountId, String cardId, String cardStatus) {
    return accountService.getAccount(accountId)
        .map(Account::getClientId)
        .map(clientId -> createUpdateCardStatusServiceRequestData(clientId, cardId, cardStatus))
        .flatMap(requestData -> cartaClient.updateCardStatus(requestData)
            .then(Mono.defer(() -> isCardBeingCancelled(cardStatus) ? allCardsCancelledForAccount(accountId) ? removeAccount(accountId) :
(isLostOrStolen(cardStatus) ? replaceCard(cardId, cardStatus).flatMap(this::updateCardNumber) : Mono.empty()) : Mono.empty())));
}

Como siempre, ¡se agradece enormemente cualquier ayuda e información que puedan proporcionar!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para extraer el Booleano contenido dentro del Mono devuelto, debes utilizar el método ‘block’ o ‘subscribe’. Aquí hay dos formas de hacerlo:

    1. Utilizando el método ‘block’:
    private boolean isLastCardForAccount(String accountId) {
        return cardService.getAccountCards(accountId)
            .hasElement()
            .block();
    }
    

    El método ‘block’ esperará el resultado del Mono y lo devolverá. En este caso, devolverá un valor Booleano.

    1. Utilizando el método ‘subscribe’:
    private void isLastCardForAccount(String accountId) {
        cardService.getAccountCards(accountId)
            .hasElement()
            .subscribe(hasCards -> {
                if (hasCards) {
                    // La lista no está vacía
                } else {
                    // La lista está vacía
                }
            });
    }
    

    El método ‘subscribe’ se suscribirá al Mono y recibirá su resultado cuando esté disponible. En este caso, recibirá un valor Booleano y realizará una acción basada en su valor.

Comments are closed.