Въведение в „Вавър“

1. Общ преглед

Vavr е обектно-функционална библиотека за разширения на езици за Java 8+. Той помага да се намали количеството код и да се увеличи надеждността.

В тази статия ще научим за инструмента на Vavr , наречен Either . Ако искате да научите повече за библиотеката на Vavr , проверете тази статия.

2. Какво е или ?

Във функционален свят на програмиране функционалните стойности или обекти не могат да бъдат модифицирани (т.е. в нормална форма); в терминологията на Java това е известно като неизменни променливи.

И двете представляват стойност на два възможни типа данни. Един Или е или ляв или десен . По споразумение лявото означава резултат от случай на неуспех, а дясното означава успех.

3. Зависимости на Maven

Трябва да добавим следната зависимост в pom.xml :

 io.vavr vavr 0.9.0 

Най-новата версия на Vavr е достъпна в Централното хранилище на Maven.

4. Използвайте калъфи

Нека да разгледаме случай на употреба, при който трябва да създадем метод, който взема вход и въз основа на входа ще върнем или низ или цяло число .

4.1. Обикновена Java

Можем да приложим това по два начина. Или нашият метод може да върне карта с ключа, представляващ резултат за успех / неуспех, или може да върне списък / масив с фиксиран размер, където позицията означава тип резултат.

Ето как може да изглежда това:

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"); }

За втория подход бихме могли да използваме следния код:

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; }

Както виждаме, и двата начина изискват доста работа, а крайният резултат не е много естетически привлекателен, нито безопасен за използване.

4.2. С И двете

Сега нека видим как можем да използваме Vavr е Или програма, за да постигнете същия резултат:

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

Не, изисква се изрично преливане на типове, проверка на нула или създаване на неизползван обект.

Освен това, Either предоставя много удобен монадически API за справяне и с двата случая:

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

По конвенция, Left Или е атрибут представлява случай недостатъчност и десния този представлява успех. Въпреки това, въз основа на нашите нужди можем да променим това, като използваме прогнози - или във Vavr не е пристрастен към ляво или дясно.

Ако прожектираме надясно, операции като filter (), map () няма да имат ефект, ако Either е Left.

Например, нека създадем правилната проекция и дефинираме някои операции върху нея:

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

Ако се окаже, че ние очаква Left на правото, ние ще се свържем празен списък веднага.

Можем да взаимодействаме с лявата проекция по подобен начин:

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

4.3. Допълнителни функции

Налични са много от помощните програми за И двете . нека да разгледаме някои от тях.

Можем да проверим дали някой от двата съдържа само ляв или десен, използвайки методите isLeft и isRight :

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

Можем да проверим дали Either съдържа дадена дясна стойност:

result.contains(100)

Можем да сгънем ляво и дясно към един често срещан тип:

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

или ... дори да сменяте страни:

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

5. Заключение

В този кратък урок, което сме научили за използването на двата полезността на Vavr рамка на. Повече подробности за И двете може да намерите тук.

Както винаги, пълният изходен код е достъпен в GitHub.