Javaでペアを使う

Javaでのペアの使用

1. 概要

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

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

参考文献:

内部のJava HashMap

Hashmapの内部への迅速で実用的なガイド

Javaでマップを反復処理する

JavaのMapのエントリを反復処理するさまざまな方法を学びます。

Java –複数のコレクションを組み合わせる

Javaで複数のコレクションを結合するための迅速かつ実用的なガイド

2. コアJava実装

2.1. Pairクラス

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

Pair 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 entry
  = new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();

キーと値には、標準のgetterおよびsetterメソッドを介してアクセスできます。

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

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

これは、可変ペアクラスと同様に機能しますが、ペアの値は変更できません。 そうしようとすると、UnsupportedOperationExceptionになります。

3. Apache Commons

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

ここで、2つのサブクラスを見つけることができます–不変と可変のペアを表します:ImmutablePairMutablePair.

両方の実装は、キー/値ゲッター/セッターメソッドにアクセスできます。

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

当然のことながら、ImmutablePairsetValue()を呼び出そうとすると、UnsupportedOperationException.になります。

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

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

4. Vavr

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

Tuple2 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–アレイ

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

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

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

7. 結論

このチュートリアルでは、JavaでのPairsの概念と、コアJavaおよびその他のサードパーティライブラリで使用できるさまざまな実装について説明しました。

いつものように、このチュートリアルon Githubを裏付けるコードを見つけることができます。