我必须从一些原始类型的集合中生成对象的集合。因此,我尝试了以下两种方法,并且两种方法均有效:
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)
那么,哪一种更好,而第二种实际上是如何工作的呢?还有更好的方法吗?
最佳答案
第一个可以减少为(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()
的参数。
关于scala - 使用压缩集合在Scala中初始化案例类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39150550/