Interopérabilité entre Java et Vavr

Interopérabilité entre Java et Vavr

1. Vue d'ensemble

Étant donné que Vavr travaille principalement dans l’écosystème Java, il est toujours nécessaire de convertir les structures de données de Vavr en structures de données compréhensibles par Java.

Par exemple, considérons une fonction qui renvoie unio.vavr.collection.List, et nous devons transmettre le résultat à une autre fonction qui acceptejava.util.List. C'est là que l'interopérabilité Java-Vavr est utile.

Dans ce didacticiel, nous allons voir commentconvert several Vavr data structures into our standard Java collections and vice versa.

2. Conversion de Vavr en Java

L'interfaceValue dans Vavr est une interface de base pour la plupart des outils Vavr. Ainsi, toutes les collections de Vavr héritent des propriétés deValue.

Ceci est utile en tant quethe Value interface comes with a lot of toJavaXXX() methods qui nous permettent de convertir les structures de données Vavr en équivalents Java.

Voyons comment un JavaList peut être obtenu à partir desList 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();

Le premier exemple convertit une liste Vavr en une liste Java et le suivant convertit un flux en une liste Java. Les deux exemples reposent sur la méthodetoJavaList().

De même,we can obtain other Java collections from Vavr objects.

Voyons un autre exemple de conversion d'un VavrMap en JavaMap:

Map vavrMap = HashMap.of("1", "a", "2", "b", "3", "c");
java.util.Map javaMap = vavrMap.toJavaMap();

Outre les collections Java standard,Vavr also provides APIs for converting values to Java streams and*Optionals*.

Voyons un exemple d’obtention d’unOptional en utilisant la méthodetoJavaOptional():

List vavrList = List.of("Java");
Optional optional = vavrList.toJavaOptional();
assertEquals("Java", optional.get());

Comme aperçu des méthodes Vavr de ce type, nous avons:

  • toJavaArray ()

  • toJavaCollection ()

  • toJavaList ()

  • toJavaMap ()

  • toJavaSet ()

  • toJavaOptionnel ()

  • toJavaParallelStream ()

  • toJavaStream ()

Une liste complète des API utiles peut être trouvéehere.

3. Conversion de Java en Vavr

Toutes les implémentations de collection dans Vavr ont un type de base deTraversable. Thus,each collection type features a static method ofAll() that takes an Iterable and converts it to the corresponding Vavr collection.

Voyons comment nous pouvons convertir unjava.util.List en un VavrList:

java.util.List javaList = Arrays.asList("Java", "Haskell", "Scala");
List vavrList = List.ofAll(javaList);

De même, nous pouvons utiliser la méthodeofAll() pour convertir les flux Java en collections Vavr:

java.util.stream.Stream javaStream
  = Arrays.asList("Java", "Haskell", "Scala").stream();
Stream vavrStream = Stream.ofAll(javaStream);

4. Vues de la collection Java

La bibliothèque Vavr fournit égalementJava collection views which delegate calls to the underlying Vavr collections.

Les méthodes de conversion Vavr vers Java créent une nouvelle instance en parcourant tous les éléments pour créer une collection Java. Cela signifie que les performances de la conversion sont linéaires, tandis que les performances de création de vues de collection sont constantes.

Au moment d'écrire cet article, seule la vueList est prise en charge dans Vavr.

Pour lesList, deux méthodes sont disponibles pour obtenir notre vue. Le premier estasJava() qui renvoie un sableList immuable, le suivant estasJavaMutable().

Voici un exemple illustrant lesList Java immuables:

@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());
}

Comme leList est immuable, effectuer toute modification dessus lance unUnsupportedOperationException.

Nous pouvons également obtenir unList mutable en invoquant la méthodeasJavaMutable() urList.

Voici comment nous procédons:

@Test
public void givenParams_whenVavrListConvertedToMutable_thenRetunMutableList() {
    java.util.List javaList = List.of("Java", "Haskell", "Scala")
      .asJavaMutable();
    javaList.add("Python");

    assertEquals(4, javaList.size());
}

5. Conversion entre objets Vavr

Semblable à la conversion entre Java en Vavr et vice-versa, nous pouvons convertir un typeValue dans Vavr en d'autres typesValue. Cette fonctionnalité de conversion facilite la conversion entre les objets Vavr en cas de besoin.

Par exemple, nous avons unList d'éléments, et nous voulons filtrer les doublons tout en préservant l'ordre. Dans ce cas, nous aurions besoin d'unLinkedHashSet. Voici un exemple illustrant le cas d’utilisation:

List vavrList = List.of("Java", "Haskell", "Scala", "Java");
Set linkedSet = vavrList.toLinkedSet();
assertEquals(3, linkedSet.size());
assertTrue(linkedSet instanceof LinkedHashSet);

Il existe de nombreuses autres méthodes disponibles dans l'interface Valeur qui nous aident à convertir des collections en différents types en fonction des cas d'utilisation.

Une liste complète des API peut être trouvéehere.

6. Conclusion

Dans cet article, nous avons découvert la conversion entre les types de collection Vavr et Java. Pour découvrir plus d'API fournies pour la conversion par le framework selon le cas d'utilisation, reportez-vous auxJavaDoc et auxuser guide.

Le code source complet de tous les exemples de cet article se trouve àover on Github.