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インターフェイスに多くのtoJavaXXX()メソッドが付属しており、Vavrデータ構造を同等のJavaに変換できるので便利です。

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

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をJavaMap:に変換する別の例を見てみましょう。

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

標準のJavaコレクションに加えて、 Vavrは、値をJavaストリームおよびオプションに変換するためのAPIも提供します。

toJavaOptional()メソッドを使用してオプションのを取得する例を見てみましょう。

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の完全なリストは、ここにあります。

3. JavaからVavrへの変換

Vavrのすべてのコレクション実装には、次の基本タイプがあります。 トラバース可能。 したがって、 各コレクションタイプは、Iterableを取得して対応するVavrコレクションに変換する静的メソッドofAll()を備えています。

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

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ビューのみがサポートされています。

リストの場合、ビューを取得するために使用できる2つのメソッドがあります。 最初はasJava()で、これは不変のリストを返し、次は asJavaMutable()。です。

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

@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()メソッドを呼び出すことにより、変更可能な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オブジェクト間の変換に役立ちます。

たとえば、アイテムのリストがあり、順序を維持しながら重複をフィルタリングしたいとします。 この場合、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の完全なリストは、ここにあります。

6. 結論

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

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