如何使用Arity-1调用此方法在scala中工作?

时间:2015-07-26 21:04:14

标签: scala apache-spark

我是Scala和Spark的新手。我写了下面的程序工作正常。但是我不明白它是如何工作的。任何帮助将不胜感激。

object MyFirstSparkProgram extends App {
  def filterString(string : String) : Boolean = {
    string.contains("Python") || string.contains("Spark")
  }

  val sc = new SparkContext(conf)

  val rdd = sc.textFile("README.md").filter(s => filterString(s)) 
   // I understand this 

  val rdd1 = sc.textFile("README.md").filter(filterString(_)) 
   // I understand this

  val rdd2 = sc.textFile("README.md").filter(filterString) 
   // I know this works, but do not understand how does it work. 
   // The filterString method is defined with an argument(String),
   // how its called successfully without an argument?
}

我对Scala的理解是,如果方法没有参数,则可以在没有括号的情况下调用它。 (http://docs.scala-lang.org/style/method-invocation.html),但我的方法filterString有一个参数。没有括号怎么称它?上面的链接有一个Arity-1的例子,但它对我没用。

2 个答案:

答案 0 :(得分:2)

2和第3个例子基本相同,它只是Function1[String, Boolean](=>是糖)

val f1: String => Boolean = filterString(_)
val f2: String => Boolean = filterString

您没有调用该函数,您正在传递对它的引用

答案 1 :(得分:1)

如果您使用需要显式参数的方法的方法名称,并且不提供足够的参数列表(即零而不是一个),并使用那个需要函数值的裸名称,编译器会转换这样的表达式为适当类型的函数值:

scala> def f(i:Int) = 5
f: (i: Int)Int

scala> List(6).map(f)
res1: List[Int] = List(5)

scala> (f(_)) andThen f
res9: Int => Int = <function1>

scala> val x: Int=>Int = f
x: Int => Int = <function1>

它仅适用于某些情境,在其他情况下,您可能需要使用(_)

scala> val y = f
<console>:8: error: missing arguments for method f;
follow this method with `_' if you want to treat it as a partially applied function
       val y = f
               ^
scala> val y = f _
y: Int => Int = <function1>

scala> f andThen f
<console>:9: error: missing arguments for method f;
follow this method with `_' if you want to treat it as a partially applied function
              f andThen f
              ^

此设计决策允许您将有意义的方法视为有效的方法。