JavaとVavrの間の相互運用性

JavaとVavrの相互運用性

1. 概要

Vavrは主にJavaエコシステム内で機能するため、Vavrのデータ構造をJavaが理解できるデータ構造に変換する必要が常にあります。

たとえば、io.vavr.collection.Listを返す関数について考えてみます。その結果を、java.util.List.を受け入れる別の関数に渡す必要があります。ここでJava-Vavrの相互運用性が役立ちます。

このチュートリアルでは、convert several Vavr data structures into our standard Java collections and vice versaを実行する方法を見ていきます。

2. VavrからJavaへの変換

VavrのValueインターフェースは、ほとんどのVavrツールの基本インターフェースです。 したがって、すべてのVavrのコレクションは、Value.のプロパティを継承します。

これは、Vavrデータ構造を同等のJavaに変換できるthe Value interface comes with a lot of toJavaXXX() methodsとして役立ちます。

VavrのListまたはStreamからJavaListを取得する方法を見てみましょう。

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

最初の例はVavrリストをJavaリストに変換し、次の例はストリームをJavaリストに変換します。 どちらの例もtoJavaList()メソッドに依存しています。

同様に、we can obtain other Java collections from Vavr objects

VavrMapをJavaMap:に変換する別の例を見てみましょう。

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

標準のJavaコレクションに加えて、Vavr also provides APIs for converting values to Java streams and*Optionals*.

toJavaOptional()メソッドを使用してOptional を取得する例を見てみましょう。

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

このタイプのVavrメソッドの概要として、次のものがあります。

  • toJavaArray()

  • toJavaCollection()

  • toJavaList()

  • toJavaMap()

  • toJavaSet()

  • toJavaOptional()

  • toJavaParallelStream()

  • toJavaStream()

便利なAPIの完全なリストは、hereにあります。

3. JavaからVavrへの変換

Vavrのすべてのコレクション実装の基本タイプはTraversable. したがって、each collection type features a static method ofAll() that takes an Iterable and converts it to the corresponding Vavr collectionです。

java.util.List をVavrListに変換する方法を見てみましょう。

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

同様に、ofAll()メソッドを使用して、JavaストリームをVavrコレクションに変換できます。

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

4. Javaコレクションビュー

VavrライブラリはJava collection views which delegate calls to the underlying Vavr collectionsも提供します。

VavrからJavaへの変換メソッドは、すべての要素を反復処理してJavaコレクションを構築することにより、新しいインスタンスを作成します。 これは、コレクションビューの作成のパフォーマンスが一定であるのに対し、変換のパフォーマンスは線形であることを意味します。

この記事の執筆時点では、VavrではListビューのみがサポートされています。

Listの場合、ビューを取得するために使用できる2つの方法があります。 最初はasJava() で、これは不変のList を返し、次はasJavaMutable().です。

不変のJavaListを示す例を次に示します。

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

Listは不変であるため、変更を実行するとUnsupportedOperationExceptionがスローされます。

List.asJavaMutable() メソッドを呼び出すことにより、変更可能なListを取得することもできます。

方法は次のとおりです。

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

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

5. Vavrオブジェクト間の変換

JavaからVavrへの変換、およびその逆の変換と同様に、VavrのValueタイプを他のValueタイプに変換できます。 この変換機能は、必要な場合にVavrオブジェクト間の変換に役立ちます。

たとえば、Listのアイテムがあり、順序を維持しながら重複をフィルタリングしたいとします。 この場合、LinkedHashSetが必要になります。 ユースケースを示す例を次に示します。

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

Valueインターフェースには、ユースケースに応じてコレクションをさまざまなタイプに変換するのに役立つ他の多くのメソッドがあります。

APIの完全なリストは、hereにあります。

6. 結論

この記事では、VavrとJavaのコレクションタイプ間の変換について学習しました。 ユースケースに従ってフレームワークによって変換用に提供されているその他のAPIを確認するには、JavaDocuser guideを参照してください。

この記事のすべての例の完全なソースコードは、over on Githubにあります。