Interoperabilität zwischen Java und Vavr

Interoperabilität zwischen Java und Vavr

1. Überblick

Da Vavr hauptsächlich innerhalb des Java-Ökosystems arbeitet, müssen die Datenstrukturen von Vavr immer in Java-verständliche Datenstrukturen konvertiert werden.

Stellen Sie sich zum Beispiel eine Funktion vor, dieio.vavr.collection.List zurückgibt, und wir müssen das Ergebnis an eine andere Funktion weitergeben, diejava.util.List. akzeptiert. Hier bietet sich die Java-Vavr-Interoperabilität an.

In diesem Tutorial werden wir uns ansehen, wie manconvert several Vavr data structures into our standard Java collections and vice versa macht.

2. Konvertierung von Vavr nach Java

DieValue-Schnittstelle in Vavr ist eine Basisschnittstelle für die meisten Vavr-Tools. Somit erben alle Vavr-Sammlungen die Eigenschaften vonValue.

Dies ist nützlich alsthe Value interface comes with a lot of toJavaXXX() methods, mit denen wir die Vavr-Datenstrukturen in Java-Äquivalente konvertieren können.

Mal sehen, wie ein JavaList aus denList oderStream von Vavr erhalten werden kann:

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

Im ersten Beispiel wird eine Vavr-Liste in eine Java-Liste konvertiert, und im nächsten Beispiel wird ein Stream in eine Java-Liste konvertiert. Beide Beispiele basieren auf dertoJavaList()-Methode.

In ähnlicher Weise istwe can obtain other Java collections from Vavr objects.

Sehen wir uns ein weiteres Beispiel für die Konvertierung eines VavrMapin ein JavaMap:an

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

Neben Standard-Java-SammlungenVavr also provides APIs for converting values to Java streams and*Optionals*.

Sehen wir uns ein Beispiel für das Erhalten einesOptional unter Verwendung dertoJavaOptional()-Methode an:

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

Als Übersicht über die Vavr-Methoden dieses Typs haben wir:

  • toJavaArray ()

  • toJavaCollection ()

  • toJavaList ()

  • toJavaMap ()

  • toJavaSet ()

  • toJavaOptional ()

  • toJavaParallelStream ()

  • toJavaStream ()

Eine vollständige Liste nützlicher APIs finden Sie inhere.

3. Konvertierung von Java in Vavr

Alle Erfassungsimplementierungen in Vavr haben einen Basistyp vonTraversable. Thus,each collection type features a static method ofAll() that takes an Iterable and converts it to the corresponding Vavr collection.

Mal sehen, wie wir einjava.util.List in ein VavrListumwandeln können:

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

Ebenso können wir dieofAll()-Methode verwenden, um Java-Streams in Vavr-Sammlungen zu konvertieren:

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

4. Java-Sammlungsansichten

Die Vavr-Bibliothek bietet auchJava collection views which delegate calls to the underlying Vavr collections.

Die Konvertierungsmethoden von Vavr nach Java erstellen eine neue Instanz, indem sie alle Elemente durchlaufen, um eine Java-Sammlung zu erstellen. Dies bedeutet, dass die Konvertierungsleistung linear ist, während die Leistung beim Erstellen von Sammlungsansichten konstant ist.

Zum Zeitpunkt des Schreibens dieses Artikels wird in Vavr nur die AnsichtListunterstützt.

Für dieList stehen zwei Methoden zur Verfügung, um unsere Ansicht zu erhalten. Das erste istasJava() , das einen unveränderlichenList and zurückgibt, das nächste istasJavaMutable().

Hier ist ein Beispiel, das die unveränderlichen JavaListzeigt:

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

DaList unveränderlich ist, wird durch Ausführen von Änderungen einUnsupportedOperationException ausgelöst.

Wir können auch ein veränderlichesList erhalten, indem wir dieasJavaMutable() -Smethod fürList. aufrufen

So machen wir das:

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

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

5. Konvertierung zwischen Vavr-Objekten

Ähnlich wie bei der Konvertierung zwischen Java in Vavr und umgekehrt können wir einenValue-Typ in Vavr in andereValue-Typen konvertieren. Diese Konvertierungsfunktion hilft bei der Konvertierung zwischen den Vavr-Objekten, wenn dies erforderlich ist.

Zum Beispiel haben wirList von Elementen, und wir möchten die Duplikate filtern, während die Reihenfolge beibehalten wird. In diesem Fall würden wir einLinkedHashSet benötigen. Hier ist ein Beispiel, das den Anwendungsfall demonstriert:

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

In der Value-Schnittstelle stehen viele andere Methoden zur Verfügung, mit deren Hilfe wir Sammlungen in Abhängigkeit von den Anwendungsfällen in verschiedene Typen konvertieren können.

Eine vollständige Liste der APIs finden Sie inhere.

6. Fazit

In diesem Artikel haben wir Informationen zur Konvertierung zwischen Vavr- und Java-Sammlungstypen erhalten. Weitere Informationen zu APIs, die vom Framework für die Konvertierung gemäß Anwendungsfall bereitgestellt werden, finden Sie inJavaDoc unduser guide.

Den vollständigen Quellcode für alle Beispiele in diesem Artikel finden Sie inover on Github.