使用压缩集合在scala中初始化案例类

Kar*_*Kid 2 scala scala-collections

我必须从一些原始类型的集合中生成一个对象集合.所以我尝试了以下两种方法并且都工作:

case class Gr (x:Int,y:Int, z:Int)

val x = List(1,2,4,2,5)
val y = Array(1,2,7,4,5)
val z = Seq(1,2,4,8,5)


(x,y,z).zipped.toList.map(a => Gr(a._1,a._2,a._3))
(x,y,z).zipped.map(Gr:(Int,Int,Int) => Gr) 
Run Code Online (Sandbox Code Playgroud)

那么,哪一个更好,第二个实际上如何工作?还有更好的方法吗?

jwv*_*wvh 6

第一个可以减少到(x,y,z).zipped.toList.map(Gr.tupled)第二个可以减少到(x,y,z).zipped.map(Gr),这似乎更短/更清晰.


回想一下,参数map()是,基本上,A => B所以不是写ds.map(d => Math.sqrt(d)),而是类型Double => Double,我们可以简单地写,ds.map(Math.sqrt)因为sqrt()是正确的类型.

在这种情况下,Gr构造函数是类型(A,A,A) => B.Scala编译器能够获取zipped构造函数类型的输出并与之匹配,因此构造函数可以用作参数map().