Vavrのどちらかへの紹介
1. 概要
Vavr は、Java8以降用のオープンソースのオブジェクト機能言語拡張ライブラリです。 コードの量を減らし、堅牢性を高めるのに役立ちます。
この記事では、 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. どちらか
次に、Vavrの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(...)
// ...
慣例により、いずれかのLeft 属性は失敗のケースを表し、Right属性は成功を表します。 ただし、ニーズに基づいて、プロジェクションを使用してこれを変更できます。VavrのEitherは、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メソッドを使用して、EitherにLeftまたは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でから入手できます。