web-dev-qa-db-ja.com

マップ操作でのタプルのアンパック

私は頻繁にタプルのリスト、シーケンス、イテレータで作業していることに気づき、次のようなことをしたいと思います。

val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }

ただし、コンパイラはこの構文に決して同意しないようです。代わりに、私は書くことになります、

arrayOfTuples.map { 
    t => 
    val e1 = t._1
    val e2 = t._2
    e1.toString + e2 
}

これはばかげています。どうすればこれを回避できますか?

71
duckworthd

回避策はcaseを使用することです:

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}
122
Nicolas

私はタプル機能が好きです。それは便利であり、特に、タイプセーフです:

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }
29
thoredge

使ってみませんか

arrayOfTuples.map {t => t._1.toString + t._2 }

パラメータが複数回、異なる順序で必要な場合、またはネストされた構造で_が機能しない場合は、

arrayOfTuples map {case (i, s) => i.toString + s} 

短いですが、読みやすい形式のようです。

16
user unknown

別のオプションは

arrayOfTuples.map { 
    t => 
    val (e1,e2) = t
    e1.toString + e2
}
7
Kim Stebel

DottyScala 3)、 parameter untupling が拡張され、そのような構文が可能になりました:

// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")

_は、関連するTupleパーツを順番に参照します。

0
Xavier Guihot