Introdução ao Vavr's
1. Visão geral
Vavr é uma biblioteca de extensão de linguagem funcional de objeto de código aberto para Java 8+. Ajuda a reduzir a quantidade de código e aumentar a robustez.
Neste artigo, aprenderemos sobre a ferramenta deVavr chamadaEither.. Se você quiser saber mais sobre a bibliotecaVavr,check this article.
2. O que éEither?
Em um mundo de programação funcional,values or objects funcional não pode ser modificado (ou seja, emnormal form); na terminologia Java, é conhecido como variáveisimmutable.
3. Dependências do Maven
Precisamos adicionar a seguinte dependência empom.xml:
io.vavr
vavr
0.9.0
A versão mais recente deVavr está disponível emCentral Maven Repository.
4. Casos de Uso
Vamos considerar um caso de uso em que precisamos criar um método que recebe uma entrada e, com base na entrada, retornaremosString ouInteger.
4.1. Java Simples
Podemos implementar isso de duas maneiras. Nosso método pode retornar um mapa com a chave que representa o resultado de sucesso / falha ou pode retornar um tamanho fixoList/Array onde a posição denota um tipo de resultado.
É assim que isso pode parecer:
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 a segunda abordagem, poderíamos usar o seguinte 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, ambas as formas exigem bastante trabalho, e o resultado final não é muito esteticamente atraente nem seguro de usar.
4.2. ComEither
Agora vamos ver como podemos utilizar a utilidade deVavrEither para obter o mesmo resultado:
private static Either computeWithEither(int marks) {
if (marks < 85) {
return Either.left("Marks not acceptable");
} else {
return Either.right(marks);
}
}
Não, é necessária conversão de tipo explícita, verificação nula ou criação de objeto não utilizado.
Além disso,Either fornece uma API monádica muito útil para lidar com os dois casos:
computeWithEither(80)
.right()
.filter(...)
.map(...)
// ...
Por convenção, o atributoEither’s Left representa um caso de falha e oRight representa um sucesso. No entanto, com base em nossas necessidades, podemos mudar isso usando projeções -Either emVavr não é tendencioso paraLeft ouRight.
Se projetarmos paraRight,, operações comofilter(), map() não terão efeito seEither foi Esquerda.
Por exemplo, vamos criar a projeçãoRight e definir algumas operações sobre ela:
computeWithEither(90).right()
.filter(...)
.map(...)
.getOrElse(Collections::emptyList);
Se descobrirmos que projetamosLeft emRight,, obteremos uma lista vazia imediatamente.
Podemos interagir com a projeção deLeft de maneira semelhante:
computeWithEither(9).left()
.map(FetchError::getMsg)
.forEach(System.out::println);
4.3. Características adicionais __
Existem váriosEither utilitários disponíveis; vamos dar uma olhada em alguns deles.
Podemos verificar se umEither contém apenasLeft ouRight usando os métodosisLefteisRight:
result.isLeft();
result.isRight();
Podemos verificar seEither contém um determinado valorRight:
result.contains(100)
Podemosfold esquerda e direita para um tipo comum:
Either either = Either.right(42);
String result = either.fold(i -> i, Object::toString);
ou ... até trocar de lado:
Either either = Either.right(42);
Either swap = either.swap();
5. Conclusão
Neste tutorial rápido, aprendemos como usar o utilitárioEither da estrutura deVavr. Mais detalhes sobreEither podem ser encontradoshere.
Como sempre, o código-fonte completo está disponívelover on GitHub.