出典 : "Pair and Triple in Kotlin"
一般的に2つの値を返すメソッドの返り値は同一のデータの型で構成されたり異なるデータの型で組み合うことができます。
利用するメソッドが同じクラス内にある場合には一般的にクラスで利用する変数を一つ作ってメソッドで該当の変数の値を設定して必要なところでその変数を利用します。
また、2つの変数を持つデータクラスを作成後、データクラスのオブジェクトを返す方法として利用します。
2つの値を返すメソッドがいくつかあると仮定しましょう。そしてそのメソッドたちが変換する値を成す二つのデータの型は全部違います。
こういう場合は各メソッドに利用するデータクラスをすべての別のものとして定義して作るのでしょうか。
もちろん違います。
Kotlinはそういう用途で利用できるすでに定義されているクラスPair
を提供しています。Pair
は同一であるか違うデータ型の2つの値を保存したり返す時に利用されます。
2つの値は関係性があるかもしれないし、ないかもしれません。同一であるか異なるデータの型にもなれます。
どう使うか
保存する2つの値をPair
のコンストラクタに伝えると簡単にPair
クラスのオブジェクトが作られます。
Pair ("Hello", "How are you")
Pair ("First", 1)
Pair (10, null)
Pair (1.5, listOf(null))
var variable1 = "I am a String"
var variable2 = 10
Pair (variable1, variable2)
保存された値はどうやって使うか
first
とsecond
プロパティやcomponetN
メソッドを利用してそれぞれ別の変数に保存して使用するか、またはすでにcomponetN
メソッドが定義されているため、分離宣言して2つの変数に分けて受け取ることもできます。
var pair = Pair("Hello", "How are you")
println(pair.first)
println(pair.second)
println(pair.component1())
println(pair.component2())
// or
var (firstName, lastName) = Pair("Suneet", "Agrawal")
println(firstName)
println(lastName)
Pair
オブジェクトにもtoString()
のような一般的なメソッドを使用することもできます。
val pair = Pair("I am a String", listOf(1,2,3))
print(pair.toString())
Pair
オブジェクトにcopy
メソッドを利用する際に値を変更することもできますが、変更されるデータの型は既存と同一である必要があります。
val pair = Pair("I am a String", listOf(1,2,3))
print(pair)
val anotherPair = pair.copy(first = "I am new String")
print(anotherPair)
toList
メソッドを使用してPair
オブジェクトをList
に変換した後、List
のインデックスを使用して値を持ってきたり他の作業を行うこともできます。
val pair = Pair("I am a String", 10)
val list = pair.toList()
println(list[0])
println(list.get(1))
メソッドに3つの値を返すためにどうすればいいか
Triple
クラスを使用すれば良いです。3つ目の値はthird
プロパティやcomponent3
メソッドを使用して検索することができます。
val triple = Triple("I am a String", listOf(1,2,3) , 10)
println(triple.third)
println(triple.component3())
Pair
と同じようにcopy
やtoList
メソッドも利用できます。
最後に4つ以上の値を返すにはどうすればいいか
この場合は、データクラスを作ってそのクラスのオブジェクトを返した方が良いでしょう。