JavaとVavrの間の相互運用性

1概要

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

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

このチュートリアルでは、いくつかのVavrデータ構造を標準のJavaコレクションに変換する方法、およびその逆の変換方法について説明します。

2 VavrからJavaへの変換

Vavrの Value インターフェースは、ほとんどのVavrツールの基本インターフェースです。

したがって、すべてのVavrのコレクションは Value. のプロパティを継承します。

Value インターフェースには、Vavrデータ構造を同等のJavaに変換することを可能にする多くの toJavaXXX() メソッドが付属しているので、これは便利です。

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

List<String> vavrStringList = List.of("JAVA", "Javascript", "Scala");
java.util.List<String> javaStringList = vavrStringList.toJavaList();
Stream<String> vavrStream = Stream.of("JAVA", "Javascript", "Scala");
java.util.List<String> javaStringList = vavrStream.toJavaList();

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

同様に、 Vavrオブジェクトから他のJavaコレクションを取得することができます

Vavrの Map をJavaの__Mapに変換する別の例を見てみましょう。

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

標準のJavaコレクションの他に、 Vavrは値をJavaストリームに変換するためのAPIと Optionals . も提供します。

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

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

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

  • toJavaArray()

  • toJavaCollection()

  • toJavaList()

  • toJavaMap()

  • toJavaSet()

  • toJavaOptional()

  • toJavaParallelStream()

  • toJavaStream()

有用なAPIの完全なリストはhttp://www.javadoc.io/doc/io.vavr/vavr/0.9.2[ここ]にあります。

3 JavaからVavrへの変換

Vavrのすべてのコレクション実装は __Traversableの基本型を持ちます。 各コレクション型は、 Iterable を受け取り、それを対応するVavrコレクション に変換する静的メソッド ofAll()__を備えています。

__java.util.ListをVavr List__に変換する方法を見てみましょう。

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

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

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

4 Javaコレクションビュー

Vavrライブラリはまた、基になるVavrコレクションへの呼び出しを委任するJavaコレクションビューを提供します。

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

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

List には、ビューを取得するために利用できる2つのメソッドがあります。最初のものは __asJava()で、不変の List を返し、次のものは asJavaMutable()です。

これは不変のJava List を示す例です。

@Test(expected = UnsupportedOperationException.class)
public void givenParams__whenVavrListConverted__thenException() {
    java.util.List<String> javaList
      = List.of("Java", "Haskell", "Scala").asJava();

    javaList.add("Python");
    assertEquals(4, javaList.size());
}

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

List. __asJavaMutable() methodを呼び出すことによっても可変の List__を取得できます

その方法は次のとおりです。

@Test
public void givenParams__whenVavrListConvertedToMutable__thenRetunMutableList() {
    java.util.List<String> 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<String> vavrList = List.of("Java", "Haskell", "Scala", "Java");
Set<String> linkedSet = vavrList.toLinkedSet();
assertEquals(3, linkedSet.size());
assertTrue(linkedSet instanceof LinkedHashSet);

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

APIの全リストはhttp://static.javadoc.io/io.javaslang/javaslang/2.1.0-alpha/javaslang/Value.html[ここ]にあります。

6. 結論

この記事では、VavrとJavaのコレクション型間の変換について学びました。ユースケースに従ってフレームワークによる変換用に提供されているその他のAPIをチェックアウトするには、http://static.javadoc.io/io.vavr/vavr/0.9.0/io/vavr/collection/package-frameを参照してください。 html[JavaDoc]とhttp://www.vavr.io/vavr-docs/[ユーザーガイド]。

この記事のすべての例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/vavr/src/test/java/com/baeldung/vavr/collections[over on Github]。