1. 概要

このクイックチュートリアルでは、ペアとして知られる非常に便利なプログラミングの概念について説明します。 Pairs は、単純なキーと値の関連付けを処理する便利な方法を提供し、メソッドから2つの値を返したい場合に特に役立ちます。

ペアの簡単な実装は、コアJavaライブラリで利用できます。 さらに、Apache CommonsやVavrなどの特定のサードパーティライブラリは、それぞれのAPIでこの機能を公開しています。

2. コアJava実装

2.1. ペアクラス

Pairクラスはjavafx.utilパッケージにあります。 このクラスのコンストラクターは、キーとそれに対応する値の2つの引数を取ります。

Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();

この例は、ペアの概念を使用した単純なIntegerからStringへのマッピングを示しています。

示されているように、 pair オブジェクトのキーは、 getKey()メソッドを呼び出すことによって取得され、値は getValue()。を呼び出すことによって取得されます。

2.2. AbstractMap.SimpleEntryおよびAbstractMap.SimpleImmutableEntry

SimpleEntry は、AbstractMapクラス内のネストされたクラスとして定義されます。 このタイプのオブジェクトを作成するために、コンストラクターにキーと値を提供できます。

AbstractMap.SimpleEntry<Integer, String> entry 
  = new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();

キーと値には、標準のゲッターメソッドとセッターメソッドを使用してアクセスできます。

さらに、 AbstractMap クラスには、不変のペアを表すネストされたクラスSimpleImmutableEntryクラスも含まれています。

AbstractMap.SimpleImmutableEntry<Integer, String> entry
  = new AbstractMap.SimpleImmutableEntry<>(1, "one");

これは、ペアの値を変更できないことを除いて、可変ペアクラスと同じように機能します。 そうしようとすると、UnsupportedOperationExceptionが発生します。

3. Apache Commons

Apache Commonsライブラリでは、Pairクラスがorg.apache.commons.lang3.tupleパッケージにあります。 これは抽象クラスであるため、直接インスタンス化することはできません。

ここでは、不変と可変のペアを表す2つのサブクラス、 Imm utablePairMutablePair。を見つけることができます。

どちらの実装も、キー/値ゲッター/セッターメソッドにアクセスできます。

ImmutablePair<Integer, String> pair = new ImmutablePair<>(2, "Two");
Integer key = pair.getKey();
String value = pair.getValue();

当然のことながら、 ImmutablePairsetValue()を呼び出そうとすると、UnsupportedOperationExceptionが発生します。

ただし、この操作は、変更可能な実装に対して完全に有効です。

Pair<Integer, String> pair = new MutablePair<>(3, "Three");
pair.setValue("New Three");

4. Vavr

Vavrライブラリでは、ペア機能は不変のTuple2クラスによって提供されます。

Tuple2<Integer, String> pair = new Tuple2<>(4, "Four");
Integer key = pair._1();
String value = pair._2();

この実装では、作成後にオブジェクトを変更できないため、メソッドを変更すると、提供された変更を含む新しいインスタンスが返されます。

tuplePair = pair.update2("New Four");

5. 代替案I–単純なコンテナクラス

ユーザーの好みによって、または前述のライブラリがない場合のペア機能の標準的な回避策は、目的の戻り値をラップする単純なコンテナクラスを作成することです。

ここでの最大の利点は、名前を提供できることです。これは、同じクラスが異なるドメインオブジェクトを表すことを回避するのに役立ちます。

public class CustomPair {
    private String key;
    private String value;

    // standard getters and setters
}

6. 代替案II–アレイ

もう1つの一般的な回避策は、2つの要素を持つ単純な配列を使用して、同様の結果を達成することです。

private Object[] getPair() {
    // ...
    return new Object[] {key, value};
}

通常、キーは配列のインデックス0にあり、対応する値はインデックス1にあります。

7. 結論

この記事では、Javaでの Pairs の概念と、コアJavaおよびその他のサードパーティライブラリで利用可能なさまざまな実装について説明しました。

いつものように、この記事のコードはGitHubから入手できます。