Introducción a Either de Vavr

1. Información general

Vavr es una biblioteca de extensión de lenguaje funcional de objetos de código abierto para Java 8+. Ayuda a reducir la cantidad de código y a aumentar la robustez.

En este artículo, aprenderemos sobre la herramienta de Vavr llamada Either. Si desea obtener más información sobre la biblioteca Vavr , consulte este artículo.

2. ¿Qué es cualquiera ?

En un mundo de programación funcional, los valores u objetos funcionales no se pueden modificar (es decir, en forma normal); en la terminología de Java, se conoce como variables inmutables.

Cualquiera representa un valor de dos tipos de datos posibles. Un O es Izquierdo o Derecho . Por convención, la izquierda significa un resultado de caso de falla y la derecha significa un éxito.

3. Dependencias de Maven

Necesitamos agregar la siguiente dependencia en el pom.xml :

 io.vavr vavr 0.9.0 

La última versión de Vavr está disponible en el repositorio central de Maven.

4. Casos de uso

Consideremos un caso de uso en el que necesitamos crear un método que tome una entrada y, en función de la entrada, devolveremos una cadena o un entero .

4.1. Java simple

Podemos implementar esto de dos maneras. O nuestro método puede devolver un mapa con la clave que representa el resultado de éxito / fracaso, o podría devolver una Lista / Matriz de tamaño fijo donde la posición denota un tipo de resultado.

Así es como podría verse esto:

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

Para el segundo enfoque, podríamos usar el siguiente código:

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

Como podemos ver, ambos sentidos requieren bastante trabajo y el resultado final no es muy atractivo estéticamente ni seguro de usar.

4.2. Con cualquiera

Ahora veamos cómo podemos utilizar la utilidad Either de Vavr para lograr el mismo resultado:

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

No, se requiere conversión de tipos explícita, verificación nula o creación de objetos no utilizados.

Además, Either proporciona una API similar a monádica muy útil para tratar ambos casos:

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

Por convención, el atributo Izquierdo de Either representa un caso de falla y el de Derecha representa un éxito. Sin embargo, en base a nuestras necesidades podemos cambiar esto utilizando proyecciones - O en Vavr no está sesgada hacia la izquierda o la derecha.

Si proyectamos hacia la derecha, operaciones como filter (), map () no tendrán efecto si Either fue Left.

Por ejemplo, creemos la proyección Derecha y definamos algunas operaciones en ella:

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

Si resulta que proyectamos de izquierda a derecha, inmediatamente obtendremos una lista vacía.

Podemos interactuar con la proyección Izquierda de forma similar:

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

4.3. Características adicionales

Hay muchas utilidades de Either disponibles; echemos un vistazo a algunos de ellos.

Podemos verificar si un Either contiene solo Left o Right usando los métodos isLeft e isRight :

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

Podemos comprobar si Either contiene un valor Right dado :

result.contains(100)

Podemos doblar hacia la izquierda y hacia la derecha a un tipo común:

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

o ... incluso intercambiar lados:

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

5. Conclusión

En este tutorial rápido, hemos aprendido a utilizar la utilidad Either del marco de Vavr . Puede encontrar más detalles sobre Either aquí.

Como siempre, el código fuente completo está disponible en GitHub.