2012年8月28日火曜日

[Scala] Tuple

複数の値をまとめて取扱い時に便利な Tuple についてまとめておく。
特に要素が2つの Pair はさまざまな時に使うと思う。なんで Java に Pair がなかったのだろう。

このように、括弧で複数の値をくくると、Tuple オブジェクトが作成される。

val t1 = ("a" , 1);
println(t1.getClass().getName())

scala.Tuple2

値の型は何でもよい。値の数に応じて専用のクラスが用意されている。

val t1 = ("a" , 1, 1.0, 1.0f, true );
println(t1.getClass().getName())

scala.Tuple5

Tupleクラスは Tuple22 まである。つまり、値の数は22個まで。

val t1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
          1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
          1, 2, 3);

object Tuple23 is not a member of package scala

Tuple2 と Tuple3 は別名があり、それぞれ Pair()、Tritle() で値を生成できる。
Tuple2では -> 演算子でも生成できる。

val t1 = Pair("a" , 1);
println(t1.getClass().getName())
val t2 = "a" -> 1;
println(t2.getClass().getName())

scala.Tuple2

Mapは Tuple2(Pair) を複数受け取って生成することができるので、この「->」で書くと直感的にかける。以下の場合、後者のほうがキーと Value で Map を作っている感じがする(気のせい?)

    val map1 : Map[String, Int] = Map(
        Pair("a", 1), Pair("b", 2) );

    val map2 : Map[String, Int] = Map(
        "a" -> 1,  "b" -> 2 );

Tuple の生成方法まとめ。
  • Tuple2
    (x1, x2)、 x1 -> x2、 Pair(x1, x2)、 Tuple2(x1, x2)
  • Tuple3
    (x1, x2, x3)、 Triple(x1, x2, x3)、 Tuple3(x1, x2, x3)
  • Tuple4 (およびそれ以降)
    (x1, x2, x3、x4)、 Tuple4(x1, x2, x3, x4)

値取り出し


Tuple は型パラメータを持ち、各値毎に型が決定されている。
val t : Pair[String, Int]  = ("abc", 1);
val v1 : String  = t._1;
val v2 : Int  = t._2;

値の取得は「_1」、「_2」、... で取得できる。生成時に各値の型が決まっているので、 「_1」、「_2」の返す型も静的に決定されている。

各要素の型が違うため Collection 系のような各要素に一括して何かの処理を行うような機能は Tuple には用意されていない。


0 件のコメント:

コメントを投稿