Uvod u Vavr’s Either

1. Pregled

Vavr je objektno-funkcionalna knjižnica jezičnih proširenja otvorenog koda za Javu 8+. Pomaže smanjiti količinu koda i povećati robusnost.

U ovom ćemo članku naučiti o Vavr'S alat nazvan Ili. Ako želite saznati više o Vavr knjižnica, provjerite ovaj članak.

2. Što je Ili?

U svijetu funkcionalnog programiranja, funkcionalan vrijednosti ili predmeti ne može se mijenjati (tj. u normalnom obliku); u terminologiji Java poznata je kao nepromjenjive varijable.

Oba predstavljaju vrijednost dvije moguće vrste podataka. An Ili je ili a Lijevo ili a Pravo. Prema dogovoru, Lijevo označava rezultat slučaja neuspjeha i Pravo znači uspjeh.

3. Ovisnosti Mavena

Moramo dodati sljedeću ovisnost u pom.xml:

 io.vavr vavr 0.9.0 

Najnovija verzija Vavr dostupan je u središnjem spremištu Maven.

4. Koristite slučajeve

Razmotrimo slučaj upotrebe u kojem trebamo stvoriti metodu koja uzima ulaz i na temelju unosa vratit ćemo ili Niz ili an Cijeli broj.

4.1. Obična Java

To možemo provesti na dva načina. Ili naša metoda može vratiti kartu s ključem koji predstavlja rezultat uspjeha / neuspjeha ili može vratiti fiksnu veličinu Popis / polje gdje pozicija označava vrstu rezultata.

Evo kako bi ovo moglo izgledati:

javna statička karta computeWithoutEitherUsingMap (int oznake) {Rezultati mape = novi HashMap (); if (oznake <85) {results.put ("FAILURE", "Oznake nisu prihvatljive"); } else {results.put ("USPJEH", ocjene); } vratiti rezultate; } javna statička void glavna (String [] args) {Rezultati mape = computeWithoutEitherUsingMap (8); Pogreška niza = (Niz) results.get ("FAILURE"); int oznake = (int) results.get ("USPJEH"); }

Za drugi pristup mogli bismo upotrijebiti sljedeći kod:

javni statični objekt [] computeWithoutEitherUsingArray (int oznake) {objekt [] rezultati = novi objekt [2]; if (oznake <85) {results [0] = "Oznake nisu prihvatljive"; } else {rezultati [1] = ocjene; } vratiti rezultate; }

Kao što vidimo, oba načina zahtijevaju poprilično rada, a konačni rezultat nije estetski privlačan niti siguran za upotrebu.

4.2. S Ili

Sada da vidimo kako možemo iskoristiti Vavr‘S Ili uslužni program za postizanje istog rezultata:

private static Either computeWithEither (int marks) {if (marks <85) {return Either.left ("Oznake nisu prihvatljive"); } else {povratak Ili.desno (ocjene); }} 

Ne, potrebno je eksplicitno lijevanje tipa, provjera nule ili stvaranje neiskorištenog objekta.

Štoviše, Ili nudi vrlo zgodan monadički API za rješavanje oba slučaja:

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

Prema dogovoru, Bilo lijevo atribut predstavlja slučaj neuspjeha i Pravo jedan predstavlja uspjeh. Međutim, na temelju naših potreba to možemo promijeniti pomoću projekcija - Ili u Vavr nije pristran prema Lijevo ili Pravo.

Ako projiciramo na Pravo, operacije poput filter (), karta () neće imati učinka ako Ili bio Lijevo.

Na primjer, stvorimo Pravo projekciju i definirajte neke operacije na njoj:

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

Ako se pokaže da smo projicirali Lijevo prema Pravo, odmah ćemo dobiti prazan popis.

Možemo komunicirati s Lijevo projekcija na sličan način:

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

4.3. Dodatne mogućnosti

Ima ih dosta Ili dostupne komunalije; pogledajmo neke od njih.

Možemo provjeriti je li Ili sadrže samo Lijevo ili Pravo koristeći je ostavljen i ispravno je metode:

rezultat.isLeft (); rezultat.isRight ();

Možemo provjeriti je li Ili sadrži dano Pravo vrijednost:

rezultat.sadrži (100)

Možemo preklopiti Lijevo i desno na jedan uobičajeni tip:

Ili bilo = Ili bilo.desno (42); Rezultat niza = ili.fold (i -> i, Object :: toString);

ili ... čak i zamijeniti strane:

Ili bilo = Ili bilo.desno (42); Ili swap = bilo.swap ();

5. Zaključak

U ovom brzom vodiču naučili smo o korištenju Ili korisnost Vavr‘S framework. Više detalja o Ili možete pronaći ovdje.

Kao i uvijek, puni izvorni kod dostupan je na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found