1. ビジネスシナリオ ビジネス
開発では、2 つのパラメーター値が返される状況に遭遇しますが、どちらのパラメーター値も役立つため、通常はキーと値のカプセル化にマップ コレクションを使用するか、2 つのプロパティをカプセル化するクラスを作成します。戻るには、もう 1 つの方法は、org.apache.commons.lang3.tuple パッケージで提供されている、よりエレガントで美しい、Pair 抽象クラスを使用することです。
2.Pair は単純に
、Pair 抽象クラスを使用しますが、直接インスタンス化することはできませんが、getLeft() メソッドと getRight() メソッドを提供する、Pair.of(L,R) を通じてインスタンス化できます。
ペア、トリプル
org.apache.commons.lang3 は、複数の値を返すためのツール クラスを提供します。2 つの値を返すにはペアを使用し、3 つの値を返すにはトリプルを使用します。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
cn.hutool.core.lang パッケージは、Pair 用のツールキットも提供します。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.3</version>
</dependency>
List<String> list = Lists.newArrayList();
list.add("key-value");
boolean bool = true;
Pair<Boolean, List<String>> pair = Pair.of(bool, list);
System.out.println(pair.getLeft());
System.out.println(pair.getRight());
System.out.println(pair.getKey());
System.out.println(pair.getValue());
出力結果:
true
[key-value]
true
[key-value]
注:
lists.newarraylist()
List<Integer> list = new ArrayList<Integer>();
List<Integer> list = Lists.newArrayList();
Lists.newArrayList() は、実際には new ArrayList() とほぼ同じです。これが行う唯一のことは (実際には javac が代わりに行います)、山かっこ内のデータ型を (「反転」ではなく) 自動的に推定することです。Lists もツール クラスであり、Maps もツール クラスであり、このように使用することもできます。
Map<String,Object> map = Maps.newHashMap();
3. ソース コード これには
、それぞれ変更可能と不変更のペアを表す 2 つのサブクラスがあります: ImmutablePair と MutablePair。3 つはすべて、キー/値、セッター メソッド、ゲッター メソッド、getLeft() メソッド、getRight() メソッドへのアクセスを実装します。
package org.apache.commons.lang3.tuple;
import java.io.Serializable;
import java.util.Objects;
import java.util.Map.Entry;
import org.apache.commons.lang3.builder.CompareToBuilder;
public abstract class Pair<L, R> implements Entry<L, R>, Comparable<Pair<L, R>>, Serializable {
private static final long serialVersionUID = 4954918890077093841L;
public Pair() {
}
// 默认用的是子类ImmutablePair,
public static <L, R> Pair<L, R> of(L left, R right) {
return new ImmutablePair(left, right);
}
// 定义了抽象方法,目的子类去实现
public abstract L getLeft();
// 定义了抽象方法,目的子类去实现
public abstract R getRight();
// 这里的获取key其实就是获取getLeft()方法的值
public final L getKey() {
return this.getLeft();
}
// 这里的获取value 其实就是获取getRight()方法的值
public R getValue() {
return this.getRight();
}
// 这里就是比较两个Pair
public int compareTo(Pair<L, R> other) {
return (new CompareToBuilder()).append(this.getLeft(), other.getLeft()).append(this.getRight(), other.getRight()).toComparison();
}
public boolean equals(Object obj) {
if (obj == this) {
return true;
} else if (!(obj instanceof Entry)) {
return false;
} else {
Entry<?, ?> other = (Entry)obj;
return Objects.equals(this.getKey(), other.getKey()) && Objects.equals(this.getValue(), other.getValue());
}
}
public int hashCode() {
return (this.getKey() == null ? 0 : this.getKey().hashCode()) ^ (this.getValue() == null ? 0 : this.getValue().hashCode());
}
public String toString() {
return "(" + this.getLeft() + ',' + this.getRight() + ')';
}
public String toString(String format) {
return String.format(format, this.getLeft(), this.getRight());
}
}
Par クラスの getLeft() および getRight() メソッドは、サブクラスによって実装されます。親クラスは、デフォルトで ImmutablePair サブクラスを使用します。Pair は Entry<L, R> も実装し、getKey() および getValue() を使用できます。実際、これらはすべて getLeft() メソッドと getRight() メソッドを呼び出し、Comparable を継承し、2 つのペアを比較できます。Serializable を継承し、シリアル化することができます。
4. その他のタプルメソッドは
、クラス定義の Triple クラス、抽象クラス Triple<L, M, R> にあります。これは 3 つのジェネリック型を定義し、ImmutableTriple と MutableTriple の不変実装クラスと可変実装クラスのペアも提供します。
vavr ライブラリ、Tuple1 ~ Tuple8、8 つのタプルをサポート