Either i mapowanie left - Vavr

Either i mapowanie left - Vavr
Skoq
  • Rejestracja:około 6 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Kraków
  • Postów:255
0

Cześć, problem następujący:

Kopiuj
sendRequest(request) //Try<Success>
            .mapTry(request -> doSomething()) //zwraca request; Try<Either<Failure, Success>>
            .toEither() //Either<Throwable, Either<Failure, Success>>
            .mapLeft(throwable -> Failure.createFromThrowable(throwable, request.getId)) //Either<Failure, Either<Failure, Success>>
            .flatMap(it -> it) //Either<Failure, Success>

Chciałbym jakoś do metody createFromThrowable(...) przepchać lewą projekcję prawej projekcji (xD). mapLeftem tego nie ogarnę, jest jakiś sposób na coś takiego?


I tak to właśnie jest
edytowany 2x, ostatnio: Skoq
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:minuta
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2

jeden i pół terabajta powinno wystarczyć każdemu
Skoq
  • Rejestracja:około 6 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:Kraków
  • Postów:255
0

W linijce 4 operuję na obiekcie typu Either<Throwable, Either<Failure,Success>> i chciałbym utworzyć nowy obiekt typu Failure za pomocą metody createFromBlabla do której przesłałbym throwable, id oraz Failure z tego eithera. Mam nadzieję, że teraz trochę lepiej to objaśniłem :D


I tak to właśnie jest
edytowany 1x, ostatnio: Skoq
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Możesz zrobić z tego fold po prostu, ale moim zdaniem trzeba było od razu robić flat żeby nie mieć zagnieżdżonych eitherów/try. Czemu nie masz tam flatMapTry?

Dla mnie mindfuck jest w miejscu gdzie masz w ręce Success i zwracasz Try<Either<Failure,Success>> a potem cudujesz. Czemu nie mapujesz tego od razu na Either<Failure,Success> i doSomething() niech się martwi o ogarnięcie tego. Niemniej wygląda to dziwnie że masz 2 możliwości faila tam (w sensie masz Try czyli wyjątek, ale masz też Either, czyli błąd ale bez wyjątku).

W sumie jak tak patrze, to czemu nie:

Kopiuj
sendRequest()
                .toEither()
                .mapLeft(throwable -> Failure.createFromThrowable(throwable))
                .flatMap(request -> doSomething())

?
Czyli od razu zamieniasz Try<Success> na Either<Failure,Success> a potem robisz normalne flatMap. Oczywiście czytelniej będzie jakby sendRequest samo zrobiło to toEither i mapLeft i zwracało samo z siebie Either<Failure,Success>.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 6x, ostatnio: Shalom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.