Interoperabilidade entre Java e Vavr
1. Visão geral
Como o Vavr funciona principalmente no ecossistema Java, sempre há a necessidade de converter as estruturas de dados do Vavr em estruturas de dados compreensíveis por Java.
Por exemplo, considere uma função que retorna umio.vavr.collection.List, e precisamos passar o resultado para outra função que aceitajava.util.List.. É aqui que a interoperabilidade Java-Vavr se torna útil.
Neste tutorial, vamos ver comoconvert several Vavr data structures into our standard Java collections and vice versa.
2. Conversão de Vavr para Java
A interfaceValue no Vavr é uma interface básica para a maioria das ferramentas Vavr. Assim, todas as coleções de Vavr herdam as propriedades deValue.
Isso é útil comothe Value interface comes with a lot of toJavaXXX() methods, que nos permite converter as estruturas de dados Vavr em equivalentes Java.
Vamos ver como um JavaList pode ser obtido deList ouStream de Vavr:
List vavrStringList = List.of("JAVA", "Javascript", "Scala");
java.util.List javaStringList = vavrStringList.toJavaList();
Stream vavrStream = Stream.of("JAVA", "Javascript", "Scala");
java.util.List javaStringList = vavrStream.toJavaList();
O primeiro exemplo converte uma lista Vavr em uma lista Java e o próximo converte um fluxo em lista Java. Ambos os exemplos contam com o métodotoJavaList().
Da mesma forma,we can obtain other Java collections from Vavr objects.
Vamos ver outro exemplo de conversão de um VavrMap em um JavaMap:
Map vavrMap = HashMap.of("1", "a", "2", "b", "3", "c");
java.util.Map javaMap = vavrMap.toJavaMap();
Além das coleções Java padrão,Vavr also provides APIs for converting values to Java streams and*Optionals*.
Vejamos um exemplo de obtenção deOptional após o métodotoJavaOptional():
List vavrList = List.of("Java");
Optional optional = vavrList.toJavaOptional();
assertEquals("Java", optional.get());
Como uma visão geral dos métodos Vavr desse tipo, temos:
-
toJavaArray ()
-
toJavaCollection ()
-
toJavaList ()
-
toJavaMap ()
-
toJavaSet ()
-
toJavaOptional ()
-
toJavaParallelStream ()
-
toJavaStream ()
Uma lista completa de APIs úteis pode ser encontradahere.
3. Conversão de Java para Vavr
Todas as implementações de coleção no Vavr têm um tipo base deTraversable. Thus,each collection type features a static method ofAll() that takes an Iterable and converts it to the corresponding Vavr collection.
Vamos ver como podemos converter umjava.util.List para um VavrList:
java.util.List javaList = Arrays.asList("Java", "Haskell", "Scala");
List vavrList = List.ofAll(javaList);
Da mesma forma, podemos usar o métodoofAll() para converter streams Java em coleções Vavr:
java.util.stream.Stream javaStream
= Arrays.asList("Java", "Haskell", "Scala").stream();
Stream vavrStream = Stream.ofAll(javaStream);
4. Exibições de coleção Java
A biblioteca Vavr também forneceJava collection views which delegate calls to the underlying Vavr collections.
Os métodos de conversão Vavr para Java criam uma nova instância iterando por todos os elementos para criar uma coleção Java. Isso significa que o desempenho da conversão é linear, enquanto o desempenho da criação de visualizações de coleção é constante.
No momento da redação deste artigo, apenas a exibiçãoList era compatível com o Vavr.
Para oList, existem dois métodos disponíveis para obter nossa visão. O primeiro éasJava() que retorna uma areiaList imutável e o próximo éasJavaMutable().
Aqui está um exemplo que demonstra o JavaList imutável:
@Test(expected = UnsupportedOperationException.class)
public void givenParams_whenVavrListConverted_thenException() {
java.util.List javaList
= List.of("Java", "Haskell", "Scala").asJava();
javaList.add("Python");
assertEquals(4, javaList.size());
}
Como oList é imutável, qualquer modificação nele gera umUnsupportedOperationException.
Também podemos obter umList mutável invocando o métodoasJavaMutable() emList.
É assim que fazemos:
@Test
public void givenParams_whenVavrListConvertedToMutable_thenRetunMutableList() {
java.util.List javaList = List.of("Java", "Haskell", "Scala")
.asJavaMutable();
javaList.add("Python");
assertEquals(4, javaList.size());
}
5. Conversão entre objetos Vavr
Semelhante à conversão entre Java para Vavr e vice-versa, podemos converter um tipoValue em Vavr para outros tiposValue. Esse recurso de conversão ajuda na conversão entre os objetos Vavr quando houver necessidade.
Por exemplo, temosList de itens e queremos filtrar as duplicatas preservando a ordem. Nesse caso, precisaríamos de umLinkedHashSet. Aqui está um exemplo que demonstra o caso de uso:
List vavrList = List.of("Java", "Haskell", "Scala", "Java");
Set linkedSet = vavrList.toLinkedSet();
assertEquals(3, linkedSet.size());
assertTrue(linkedSet instanceof LinkedHashSet);
Existem muitos outros métodos disponíveis na interface Value que nos ajudam a converter coleções em tipos diferentes, dependendo dos casos de uso.
Uma lista completa das APIs pode ser encontradahere.
6. Conclusão
Neste artigo, aprendemos sobre a conversão entre os tipos de coleção Vavr e Java. Para verificar mais APIs fornecidas para conversão pela estrutura de acordo com o caso de uso, consulteJavaDoceuser guide.
O código-fonte completo para todos os exemplos neste artigo pode ser encontradoover on Github.