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]。