我尝试使用文件名(字符串)制作某种方便的类(下面)来保存文件夹并获取文件.这项工作如期待,但有一点我不明白是地图部分Map(folder.listFiles map {file => file.getName -> file}:_*).
我放在:_*那里以防止某种类型不兼容,但我不知道它真正做了什么.另外,_*我可以取而代之的是什么更具体?
谢谢
class FolderAsMap (val folderName:String){
val folder = new File(folderName)
private val filesAsMap: Map[String, File] = Map(folder.listFiles map
{file => file.getName -> file}:_*)
def get(fileName:String): Option[File] = {
filesAsMap.get(fileName)
}
}
Run Code Online (Sandbox Code Playgroud)
: _*是正确的.或者,您可以使用toMap:
folder.listFiles map {file => file.getName -> file}.toMap
Run Code Online (Sandbox Code Playgroud)
Map(...)是apply对象中的方法Map:def apply [A, B] (elems: (A, B)*): Map[A, B].它有一个重复的参数.预计将使用多个参数调用它.:_*用于表示您将所有参数作为一个Seq参数传递.
它避免了歧义.在java中,(其中等效的varargs是数组而不是Seqs)可能有歧义,如果一个方法f(Object... args)并且你调用它f(someArray),它可能意味着args只有一个项目,是someArray(所以f只接收一个数组)元素,其中someArray)或args是someArray和f someArray直接接收).Java选择第二个版本.在scala中,使用更丰富的类型系统Seq而不是Array模糊性可能会更频繁地出现,并且规则是当你将所有参数作为一个传递时,你总是必须写:_*,即使在没有歧义的情况下,就像在这里一样,而不是一个复杂的规则来判断何时存在实际的模糊性.