Introduzione a Vavr's Either

1. Panoramica

Vavr è una libreria di estensioni di linguaggio funzionale agli oggetti open source per Java 8+. Aiuta a ridurre la quantità di codice e ad aumentare la robustezza.

In questo articolo, impareremo a conoscere lo strumento di Vavr chiamato Either. Se vuoi saperne di più sulla libreria Vavr , controlla questo articolo.

2. Che cos'è l'uno o l'altro ?

In un mondo di programmazione funzionale, i valori funzionali o gli oggetti non possono essere modificati (cioè in forma normale); nella terminologia Java, è noto come variabili immutabili.

O rappresenta un valore di due possibili tipi di dati. Una O è una sinistra o una destra . Per convenzione, la sinistra indica un risultato in caso di errore e la destra indica un successo.

3. Dipendenze di Maven

Dobbiamo aggiungere la seguente dipendenza nel pom.xml :

 io.vavr vavr 0.9.0 

L'ultima versione di Vavr è disponibile nel Central Maven Repository.

4. Casi d'uso

Consideriamo un caso d'uso in cui dobbiamo creare un metodo che accetta un input e, in base all'input, restituiremo una stringa o un numero intero .

4.1. Semplice Java

Possiamo implementarlo in due modi. O il nostro metodo può restituire una mappa con la chiave che rappresenta il risultato di successo / fallimento, oppure potrebbe restituire un List / Array di dimensioni fisse dove la posizione indica un tipo di risultato.

Ecco come potrebbe apparire:

public static Map computeWithoutEitherUsingMap(int marks) { Map results = new HashMap(); if (marks < 85) { results.put("FAILURE", "Marks not acceptable"); } else { results.put("SUCCESS", marks); } return results; } public static void main(String[] args) { Map results = computeWithoutEitherUsingMap(8); String error = (String) results.get("FAILURE"); int marks = (int) results.get("SUCCESS"); }

Per il secondo approccio, potremmo usare il seguente codice:

public static Object[] computeWithoutEitherUsingArray(int marks) { Object[] results = new Object[2]; if (marks < 85) { results[0] = "Marks not acceptable"; } else { results[1] = marks; } return results; }

Come possiamo vedere, entrambi i modi richiedono molto lavoro e il risultato finale non è molto esteticamente accattivante né sicuro da usare.

4.2. Con entrambi

Ora vediamo come possiamo utilizzare Vavr 's O utility per ottenere lo stesso risultato:

private static Either computeWithEither(int marks) { if (marks < 85) { return Either.left("Marks not acceptable"); } else { return Either.right(marks); } } 

No, è richiesto il casting esplicito del tipo, il controllo null o la creazione di oggetti inutilizzati.

Inoltre, Either fornisce un'API monadica molto utile per gestire entrambi i casi:

computeWithEither(80) .right() .filter(...) .map(...) // ...

Per convenzione, l' attributo Left di entrambi rappresenta un caso di errore e quello di Right rappresenta un successo. Tuttavia, in base alle nostre esigenze, possiamo cambiarlo usando le proiezioni - O in Vavr non è polarizzato verso sinistra o destra.

Se proiettiamo a destra, operazioni come filter (), map () non avranno effetto se Either era Left.

Ad esempio, creiamo la proiezione Right e definiamo alcune operazioni su di essa:

computeWithEither(90).right() .filter(...) .map(...) .getOrElse(Collections::emptyList);

Se risulta che abbiamo proiettato da sinistra a destra, otterremo immediatamente un elenco vuoto.

Possiamo interagire con la proiezione di sinistra in un modo simile:

computeWithEither(9).left() .map(FetchError::getMsg) .forEach(System.out::println);

4.3. Caratteristiche aggiuntive

Ci sono un sacco di Sia utilità disponibili; diamo un'occhiata ad alcuni di loro.

Siamo in grado di controllare se un O contiene solo Sinistra o Destra utilizzando isLeft e isRight metodi:

result.isLeft(); result.isRight();

Possiamo verificare se O contiene un dato valore Right :

result.contains(100)

Possiamo piegare Sinistra e Destra a un tipo comune:

Either either = Either.right(42); String result = either.fold(i -> i, Object::toString);

o ... anche scambiare i lati:

Either either = Either.right(42); Either swap = either.swap();

5. conclusione

In questo breve tutorial, abbiamo imparato a usare l' utility Either del framework di Vavr . Maggiori dettagli su entrambi possono essere trovati qui.

Come sempre, il codice sorgente completo è disponibile su GitHub.