🍀

Kotlinの標準APIを知る【Pair/Triple編】

2021/12/29に公開

公式ドキュメント

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-triple/

Javaとの比較

生成

Javaでメジャーな方法だとcommons.lang3を使う方法かと思います

sample.java
ImmutablePair.of("left", "right");
ImmutableTriple.of("left", "center", "right");
sample.kt
Pair("left", "right")
"left" to "right" // 中置記法 to関数
Triple("left", "center", "right")

※中置記法によるPairの生成
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/to.html

値の取得(戻り値として)

Javaでは言語仕様上、単一の値しか戻せないので、インスタンスを丸ごと返して、丸ごと受け取ってから
それぞれの値を引っ張ってくるという形になるかと思います。

sample.java
final Pair<String, String> pair = ImmutablePair.of("left", "right");
final String left = pair.getLeft();
final String right = pair.getRight();

Kotlinには分解宣言という言語仕様があり、ComponentN(Nはプロパティの定義順に応じた整数)というoperator関数が実装されている場合、インスタンスのプロパティを分解して(それぞれで)受け取ることができます。このComponentN関数はdata classの場合には自動で生成され、標準APIのPairクラスTripleクラスの実態はdata classなので、それぞれで分解宣言によるプロパティ取得が可能となり、これを活用することで複数値の戻り値を疑似的に実現可能です。

sample.kt
val (left, right) = Pair("left", "right")
// 複数の値のうち一部が不要な場合は敢えて受け取らない書き方ができます
val (left, _, _) = Triple("left", "center", "right") // 明示的に捨てることを_で表現
val (first) = Triple("left", "center", "right") // 受け取る個数=プロパティの順で表現

活用どころ

現時点で思うところとしては

  • 一般的なMapの要素の生成
mapOf("key1" to "value1", "key2" to "value2")
  • 戻り値や関数の引数として切り離すのではなくセットで捉えることが自然な場合
    専用のdataクラスをわざわざ用意しなくてもDTO的な役割の場合はtypealiasでスッキリ表現できる感じがします。
// マッチングアプリ会員
data class Member
typealias Pairs = Pair<Member, Member>

fun coupling(pairs: List<Pairs>) { TODO("いくつかのカップル成立") }

Discussion