Try, Either + zewnętrzne API

0

Cześć,
mam pewien kłopot i nie wiem jak najmądrzej go rozwiązać, otóż strzelam do API zewnętrznego powiedzmy 4 requesty, każdy z nich zwraca mi JSONArray:

private JSONArray getResponse (String url, String value) throws UnirestException {
        return Unirest.get(url)
                      .headers(headers)
                      .asJson()
                      .getBody()
                      .getObject()
                      .getJSONArray(value);
}

Następnie obrabiam to sobie w taki sposób i otrzymuję takiego Either'a

private Either<ClientError, JSONArray> getPlayersInfo (final String url) {
        return Try.of(() -> getResponse(url, PLAYERS))
                  .onFailure(error -> LOGGER.log(Level.INFO, error.getMessage()))
                  .toEither()
                  .mapLeft(message -> ClientError.DOWNLOADING_ERROR);
 }

To wszystko wywołuję w taki sposób:

 final List<String> urls = Stream.of(fixturesId)
                                 .map(fixture -> String.format(PLAYER_INFO_URL, fixture)).toList();
return urls.map(this::getPlayersInfo);

Co niestety nie do końca mnie satysfakcjonuje, bo w zasadzie interesuje mnie by było to raczej - wszystko albo nic, czyli otrzymać postać Either<ClientError, List<JSONArray>> niż tak jak tutaj List<Either<ClientError, JSONArray>> i muszę przyznać, że po pracy siedzę nad tym i nie mogę wymyślić sensownego sposobu, który pozwoliłby mi osiągnąć ten pierwszy typ zwracany - który chyba będzie odpowiedniejszy (tutaj też proszę o ew. sprostowanie).

Mogę zrobić to na około jakimiś mapami etc., ale to chyba nie do końca to by chodziło.

Potrzebuję funkcyjnych tuzów, którzy pomogą mi to jakoś zmodyfikować by otrzymać typ zwracany, który lepiej mówi co tutaj powinno być rezultatem.

4

Ogarnij sobie sequence. O coś takiego chodzi?

0

@danek, dokładnie tak, a mianowicie sequenceRight, w chwilę rozwiązałeś problem, dzięki :D

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