Problem z Mono i Either

Odpowiedz Nowy wątek
2018-11-26 18:12
0

Cześć, mam takie metody w repozytorium:

Mono<Entity> findById(long id);

Mono<Entity> save(Entity entity);

a pewna z metod encji ma taką sygnaturkę:

Either<Error, Entity> businessMethod();

Chciałbym w serwisie pobrać z repo encję, wykonać metodę biznesową, zapisać i zwrócić id zapisanej encji czyli de facto Mono<Either<AppError, Long>>.

W kodzie imperatywnym jest to proste:

Entity e = findById(id);
e.businessMethod();
repo.save(e).getId();

A z mono i eitherami robi się hardkowoiej. Mam coś takiego w kotlinie:

 repo
                    .loadById(id)
                    .map {
                        it.tryBusinessMethod()
                    }
                    .flatMap { 
                        it.flatMap { 
                            repo.save(it)
                        }
                        .map{ it.id }
                    }

Ale ni chu nie mogę dojść .. to nie działą

edytowany 2x, ostatnio: Bambo, 2018-11-26 18:13

Pozostało 580 znaków

2018-11-26 19:03

Taki potworek:

 val x: Mono<Either<Error, Long>> = repo
                .loadById(id)
                .map {
                    it.businessMethod()
                }
                .flatMap { result ->
                    result.map {
                        repo.save(it)
                                .map {
                                    result.map { it.getId() }
                                }
                    }.mapLeft { Mono.just(Either.left<Error, Long>(it)) }
                    .getOrElseGet(java.util.function.Function.identity())
                }

Działa. Wygląda tragicznie....

.mapLeft { Mono.just(Either.left<Error, Long>(it)) }
                    .getOrElseGet(java.util.function.Function.identity())

można wydzielić do osobnej funkcji this::mergeError.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 3x, ostatnio: jarekr000000, 2018-11-26 19:07

Pozostało 580 znaków

2018-11-26 19:38
0

Dzięki, mistrz @jarekr000000

Ale no właśnie, wygląda jak g .. niby to funkcyjne miało takie zwięzłe być :/

Bo jest, tylko trzeba wydzielać odpowiednio nazwane funkcje i przypisywać pojedyncze kroki do odpowiednio nazwanych zmiennych - pustypawel 2018-11-27 07:41

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0