読者です 読者をやめる 読者になる 読者になる

4つと5つ値を持つTupleを作ってみた - 2016/12/04の30分 Kotlinメモ💪💪💪💪💪

4つと5つ値を持つTupleを作ってみた - 2016/12/04の30分 Kotlinメモ💪💪💪💪💪

主に前回書いた内容の発展系 + マッスル系💪

hack-it-iron.hatenablog.com

とある事情からJava Tupleのライブラリを作ってるわけですが、Kotlinは3つまで値を持つTuple(Triple)までは標準ライブラリで提供されてます。

記事を見てると、Kotlinも昔はもっと値がいっぱいあるTupleを標準で用意されていたらしいですが、どこかのタイミングでなくなったみたいですね。

なのでそこについては詳しく触れないっす。

あ、ちなみにこれが私が作ってるJava TupleライブラリのGuildです。

github.com

もっと筋肉💪 つけたいよね?

そうなんだよ。もっと値を入れられるTupleがほしいんだよ。

ということで、標準ライブラリにあるTupleを参考に4つと5つ値を持つTupleを作ってみた。

今回紹介するコードは以下のリポジトリに雑に置いてあります。

github.com

4つの値を持つTuple Quartetを作る

ネーミングセンスはjavatuplesというライブラリから拝借してます。

ざっくり書いてこんな感じ。Quartet自体はただの入れ物なので実装はシンプルでよい。

data class Quartet<out F, out S, out T, out FO>(
        val first: F,
        val second: S,
        val third: T,
        val fourth: FO) {

    override fun toString(): String {
        return "Quartet(first=$first, second=$second, third=$third, fourth=$fourth)"
    }
}

んで、前回の記事にこんなことを書きました。

Kotlinには4つ以上のTupleはないけど、自分で作って1つ値が少ないクラスに拡張関数を書けば、A to B to C to Dもできるわけだ

うむ、じゃやってみよう。

A to B to C to Dと書いてQuartetを作りたいので、TripleからQuartetを作る拡張関数を書きます。

infix fun <A, B, C, D> Triple<A, B, C>.to(that: D): Quartet<A, B, C, D> = Quartet(this.first, this.second, this.third, that)

んまーPairからTripleを作る時に書いた拡張関数を応用してあげればよい。

んで、以下のような感じでA to B to C to Dって感じで書いてあげれば、Quartetが作れる。

println(("b" to 2 to 2 to 10L))
println(("b" to 2 to 2 to 10L).javaClass)

■出力
Quartet(first=b, second=2, third=2, fourth=10)
class Quartet

もっと筋肉がほしいだろ💪💪💪💪💪 5つの値を持つTuple Quintetを作る

もうこいつは番外編です...💪💪💪💪💪

はい、実装はこんな感じね。

data class Quintet<out F, out S, out T, out FO, out FI>(
        val first: F,
        val second: S,
        val third: T,
        val fourth: FO,
        val five: FI) {

    override fun toString(): String {
        return "Quintet(first=$first, second=$second, third=$third, fourth=$fourth, five=$five)"
    }

A to B to C to D to Eと書いてQuintetを作りたいので、QuartetからQuintetを作る拡張関数を書きます。

infix fun <A, B, C, D, E> Quartet<A, B, C, D>.to(that: E): Quintet<A, B, C, D, E> = Quintet(this.first, this.second, this.third, this.fourth, that)

あー筋肉💪が増えるごとにコードが長くなっていく...

んで、以下のような感じでA to B to C to D to Eって感じで書いてあげれば、Quintetが作れる。

println(("b" to 2 to 2 to 10L to "D"))
println(("b" to 2 to 2 to 10L to "D").javaClass)

■出力
Quintet(first=b, second=2, third=2, fourth=10, five=D)
class Quintet

まとめ

toをつなげて書いてTupleが作れるのは嬉しいなー

いくらでも筋肉💪がほしくなる。

ちなみにKotlinのGenerics周りがちょっとJavaと違いそうだなーと思ったので、今後それも学んでいきたい。

kotlinlang.org

outとか使ってみたけどまだちゃんと理解してないねー