1. 概要

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

この記事では、 Vavr と呼ばれるのツールまた。 あなたがについてもっと知りたいなら Vavr 図書館、 この記事を確認してください。

2. どちらかとは何ですか?

関数型プログラミングの世界では、関数型の値またはオブジェクトを変更することはできません(つまり、 正規形); Javaの用語では、不変変数として知られています。

どちらかは、2つの可能なデータ型の値を表します。 どちらかは、またはのいずれかです。 慣例により、 Left は失敗のケースの結果を示し、Rightは成功を示します。

3. Mavenの依存関係

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

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

Vavr の最新バージョンは、 CentralMavenリポジトリで入手できます。

4. ユースケース

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

4.1. プレーンJava

これは2つの方法で実装できます。 このメソッドは、成功/失敗の結果を表すキーを持つマップを返すか、固定サイズのリスト/配列を返すことができます。ここで、positionは結果タイプを示します。

これは次のようになります。

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. どちらか

次に、VavrEitherユーティリティを使用して同じ結果を得る方法を見てみましょう。

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(...)
  // ...

慣例により、いずれかのLeft 属性は失敗のケースを表し、Right属性は成功を表します。 ただし、ニーズに基づいて、プロジェクションを使用してこれを変更できます。VavrEitherは、LeftまたはRightにバイアスされません。

Rightに投影すると、 filter()、map()などの操作は、どちらかの場合は効果がありません。 左。

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

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

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

同様の方法で、Leftプロジェクションを操作できます。

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

4.3. その他の機能

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

isLeftおよびisRightメソッドを使用して、EitherLeftまたはRightのみが含まれているかどうかを確認できます。

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

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

result.contains(100)

左右を1つの一般的なタイプに折りたたむことができます。

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のフレームワークのEitherユーティリティの使用について学習しました。 いずれかの詳細については、こちらをご覧ください。

いつものように、完全なソースコードはGitHubから入手できます。