有人可以为我介绍这段scala语法吗?我是Java的新手。
val map = Map(seq map { a => a.key -> a }: _*)
特别是我理解a => a.key -> a
是一个匿名函数,它为每个(a.key, a)
返回一对(?)a
,但: _*
,{ }
是什么为什么seq
和map
之间有空格?它们是Map
构造函数的参数吗?
答案 0 :(得分:4)
: _*
告诉编译器将arr的每个元素作为自己的参数传递给函数,而不是将它作为单个参数传递。或者换句话说it is a special instance of type ascription which tells the compiler to treat a single argument of a sequence type as a variable argument sequence, i.e. varargs
。
_*
类型注释包含在SLS的“4.6.2 Repeated Parameters
”中。
参数部分的最后一个值参数可以由“*”表示,例如, (...,x:T *)。然后,方法中的这种重复参数的类型是序列类型scala.Seq [T]。具有重复参数T *的方法采用类型为T的可变数量的参数。也就是说,如果将具有类型(p1:T1,...,pn:Tn,ps:S *)U的方法m应用于参数(e1,...,ek),其中k> = n,则m在该应用程序中具有类型(p1:T1,...,pn:Tn,ps:S,...,ps0S)U,其中k次出现类型S,其中超出ps的任何参数名称都是新的。此规则的唯一例外是,如果通过_ *类型注释将最后一个参数标记为序列参数。如果上面的m被应用于参数(e1,...,en,e0:_ *),则该应用程序中的m的类型被认为是(p1:T1,...,pn:Tn,ps:scala) .SEQ [S])
{ }
表示block of code
,由multiple statements
和declarations
组成,其值为最后一个语句的值。如果你需要声明,多个语句,导入或类似的东西,你需要大括号
Scala有一种特殊的punctuation-free
语法,用于调用带有一个参数的方法。一般规则是Scala methods that take a single parameter can be invoked without dots or parentheses
。
答案 1 :(得分:2)
除了Ramesh的答案之外......你的seq很可能是Scala系列。 Scala集合有很多方法,如map,filter,fold,reduce等等。所以map是seq上的方法调用,不使用点运算符就调用它。如果方法采用单个参数,则在Scala中允许这样做 _ *有点怪异。不可变映射需要vararg作为参数。但是seq上的map方法将返回一个Map。 _ *处于" type"的位置。按类型,我只是说,如果我写i:Int,所以Int是类型。因此,当对象的类型标记为_ *时,编译器会进行自动类型转换,编译器使用工厂将对象转换为vararg。与Java类似,varargs只能作为参数列表中的最后一个参数出现。