4つと5つ値を持つTupleを作ってみた - 2016/12/04の30分 Kotlinメモ💪💪💪💪💪
4つと5つ値を持つTupleを作ってみた - 2016/12/04の30分 Kotlinメモ💪💪💪💪💪
主に前回書いた内容の発展系 + マッスル系💪
とある事情からJava Tupleのライブラリを作ってるわけですが、Kotlinは3つまで値を持つTuple(Triple
)までは標準ライブラリで提供されてます。
記事を見てると、Kotlinも昔はもっと値がいっぱいあるTupleを標準で用意されていたらしいですが、どこかのタイミングでなくなったみたいですね。
なのでそこについては詳しく触れないっす。
あ、ちなみにこれが私が作ってるJava TupleライブラリのGuildです。
もっと筋肉💪 つけたいよね?
そうなんだよ。もっと値を入れられるTupleがほしいんだよ。
ということで、標準ライブラリにあるTupleを参考に4つと5つ値を持つTupleを作ってみた。
今回紹介するコードは以下のリポジトリに雑に置いてあります。
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と違いそうだなーと思ったので、今後それも学んでいきたい。
out
とか使ってみたけどまだちゃんと理解してないねー