为什么可以在.map(println)等表达式中省略参数?

时间:2013-04-12 20:06:40

标签: scala syntax

我有一个字符串列表

val myStrings = List("One", "Two", "Three")

我想检查列表中是否包含我做的字符串。

myStrings.exists("One".contains)

我从谷歌搜索得到这个。但我想了解它。

我看到你可以"One".contains("O")

检查One包含O是否有意义。但是我没有得到传递给myStrings.exists时没有参数的方法。

我缺少什么?

2 个答案:

答案 0 :(得分:4)

这是速记,或“语法糖”。

我确定你见过List("A","B").foreach(println)

这是相同的,如果只有一个参数,则无需指定参数。

所以myStrings.exists("One".contains)

的简写
myStrings.exists("One" contains _)

这本身就是完整函数文字的简写

myStrings.exists(x => "One" contains x)

请注意,这不会检查您的列表contains String“One”,它会检查您的List是否包含包含的String “一个”。

您可能只想在contains上使用List方法。

另请注意,contains上的List为O(n)。 Set上的相同方法是O(1) - 即恒定时间。

答案 1 :(得分:1)

当您将Function1传递给期望一个Function1的函数或方法时,您可以省略下划线。

List#foreach需要Function1[X,Unit],因此您可以说myList.foreach(println)代替myList.foreach(println(_))myList.foreach(x => println(x))

类似地:

scala> val xs = List("a","b","c")
xs: List[String] = List(a, b, c)

scala> val set = Set("c","d","e")
set: scala.collection.immutable.Set[String] = Set(c, d, e)

scala> xs.filter(set.contains)
res0: List[String] = List(c)