Vavrのどちらかの紹介

1概要

Vavr は、Java 8+用のオープンソースのオブジェクト関数型言語拡張ライブラリです。コード量を減らし、堅牢性を高めるのに役立ちます。

この記事では、 Eitherという Vavr__のツールについて学びます。

** 2 Either +とは何ですか

**

関数型プログラミングの世界では、関数型の値やオブジェクトは変更できません(例:https://en.wikipedia.org/wiki/Normal form (abstract rewriting)[normal form])。 Javaの用語では、https://en.wikipedia.org/wiki/Immutable object[immutable]変数として知られています。

いずれか は、2つの可能なデータ型の値を表します。 Either Left または https://static.javadocです。 io/io.vavr/vavr/0.9.0/io/vavr/control/Either.Right.html[右]

慣例により、 は失敗ケースの結果を意味し、 は成功を意味します。

3 Mavenの依存関係

pom.xml に次の依存関係を追加する必要があります。

<dependency>
    <groupId>io.vavr</groupId>
    <artifactId>vavr</artifactId>
    <version>0.9.0</version>
</dependency>

Vavr の最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22vavr%22[Central Maven Repository]にあります。

** 4ユースケース+

**

入力を受け取るメソッドを作成し、その入力に基づいて String または Integer を返すユースケースを考えてみましょう。

** 4.1. 普通のジャワ

**

これを実装する方法は2つあります。私たちのメソッドは成功/失敗の結果を表すキーを持つマップを返すことができます。あるいはpositionが結果の型を表す固定サイズの List/Array を返すこともできます。

これは、これがどのように見えるかです:

public static Map<String, Object> computeWithoutEitherUsingMap(int marks) {
    Map<String, Object> results = new HashMap<>();
    if (marks < 85) {
        results.put("FAILURE", "Marks not acceptable");
    } else {
        results.put("SUCCESS", marks);
    }
    return results;
}

public static void main(String[]args) {
    Map<String, Object> results = computeWithoutEitherUsingMap(8);

    String error = (String) results.get("FAILURE");
    int marks = (int) results.get("SUCCESS");
}

2番目の方法では、次のコードを使用できます。

public static Object[]computeWithoutEitherUsingArray(int marks) {
    Object[]results = new Object[2];
    if (marks < 85) {
        results[0]= "Marks not acceptable";
    } else {
        results[1]= marks;
    }
    return results;
}

ご覧のとおり、どちらの方法でもかなりの作業が必要になり、最終的な結果は美的に魅力的でもなく、また使用するのも安全でもありません。

** 4.2. どちらかと__

**

それでは、同じ結果を得るために Vavr 's Either ユーティリティを使用する方法を見てみましょう。

private static Either<String, Integer> computeWithEither(int marks) {
    if (marks < 85) {
        return Either.left("Marks not acceptable");
    } else {
        return Either.right(marks);
    }
}

いいえ、明示的な型キャスト、nullチェック、または未使用のオブジェクト作成は必要ありません。

さらに、 Either は両方のケースを扱うための非常に便利なモナドのようなAPIを提供します。

computeWithEither(80)
  .right()
  .filter(...)
  .map(...)
 //...

慣例により、 EitherのLeft 属性は失敗のケースを表し、 Right 属性は成功を表します。しかし、私たちのニーズに基づいて、これを予測を使って変更することができます。

  • Rightに投影した場合、 filter()、map() などの 操作は、 Either __ Leftの場合には効果がありません。

たとえば、 Right プロジェクションを作成し、それにいくつかの操作を定義しましょう。

computeWithEither(90).right()
  .filter(...)
  .map(...)
  .getOrElse(Collections::emptyList);

左を 右に射影したことが判明した場合は、すぐに空のリストが表示されます。

同様にして Left 射影と対話することができます。

computeWithEither(9).left()
  .map(FetchError::getMsg)
  .forEach(System.out::println);

** 4.3. 追加の機能____

__ **

利用可能なたくさんの Either ユーティリティがあります。それらのいくつかを見てみましょう。

Either Left または Right のみを含んでいるかどうかは、 isLeft および isRight メソッドを使って確認できます。

result.isLeft();
result.isRight();

Either に指定の Right 値が含まれているかどうかを確認できます。

result.contains(100)

左と右をひとつの共通の型に折り畳むことができます。

Either<String, Integer> either = Either.right(42);
String result = either.fold(i -> i, Object::toString);

あるいは…辺を入れ替えさえします:

Either<String, Integer> either = Either.right(42);
Either<Integer, String> swap = either.swap();

5結論

このクイックチュートリアルでは、 Vavr sフレームワークの Either ユーティリティの使用方法について学びました。 Either の詳細はhttp://slides.com/pivovarit/to-try-or-not-to-try-there-is-no-throws#/32[ここ]を参照してください。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/vavr/src/main/java/com/baeldung/vavr/either[GitHubで利用可能]です。

前の投稿:クックブック
次の投稿:動物探知機Mavenプラグインの紹介