你能解释一下这段Scala代码吗?

时间:2017-05-26 16:00:25

标签: scala

有人可以为我介绍这段scala语法吗?我是Java的新手。

val map = Map(seq map { a => a.key -> a }: _*)

特别是我理解a => a.key -> a是一个匿名函数,它为每个(a.key, a)返回一对(?)a,但: _*{ }是什么为什么seqmap之间有空格?它们是Map构造函数的参数吗?

2 个答案:

答案 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 statementsdeclarations组成,其值为最后一个语句的值。如果你需要声明,多个语句,导入或类似的东西,你需要大括号

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只能作为参数列表中的最后一个参数出现。