我是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的例子,但它对我没用。
答案 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
^
此设计决策允许您将有意义的方法视为有效的方法。