看用Scalding寫的MapReduce程式時,看到有這么個函式定義:
def flatMap[A, T](fs: (Fields, Fields))(fn: A => TraversableOnce[T])(implicit conv: TupleConverter[A], setter: TupleSetter[T]): Pipe = {
conv.assertArityMatches(fs._1)
setter.assertArityMatches(fs._2)
each(fs)(new FlatMapFunction[A, T](fn, _, conv, setter))
}
呼叫的時候是這樣:
flatMap('line -> 'word){ lineA : String => tokenize(lineA) } //tokenize(是一個函式, 不用考慮)
我就不明白了:
函式定義的明明是3層括號,也就像是3層柯里化似的, 但是呼叫函式的時候, 為什么用一個()和一個{}就搞定了呢??
而且lineA : String => tokenize(lineA)這句是什么意思?! 如果是傳入一個匿名函式作為引數,也應該是加小括號啊: (lineA : String) => tokenize(lineA)
uj5u.com熱心網友回復:
沒人回答么? 這里應該都是scala的高手啊!uj5u.com熱心網友回復:
沒人知道么 ??我加分了!!!!!!
uj5u.com熱心網友回復:
沒人回答么? 這里應該都是scala的高手啊uj5u.com熱心網友回復:
我看不懂 小學生飄過uj5u.com熱心網友回復:
第一個引數是pair第二個引數是function,呼叫時{}用來代替具體的函式
第三個引數是implicit,背景關系中有implicit的參考就可以省略這個引數
uj5u.com熱心網友回復:
不要以命令式編程語言(c/c++)來理解它,學習它,就要按照它的思考方式函式式lineA : String => tokenize(lineA)意思是String型別的變數lineA,把他傳入函式tokenize
人家這個語言就是這種寫法,為啥一定要是命令式語言的寫法 (lineA : String) => tokenize(lineA)
uj5u.com熱心網友回復:
'line -> 'word 傳給了 fs: (Fields, Fields)lineA : String => tokenize(lineA) 傳給了 (fn: A => TraversableOnce[T])
implicit conv: TupleConverter[A], setter: TupleSetter[T] 這個不用傳,只要背景關系中有implicit定義就行
在scala中如果呼叫函式只有一個引數,呼叫時可以使用{}來替代()
這里用了柯里化,(fn: A => TraversableOnce[T]) 小括號中只有一個引數,所以在呼叫時 可以使用{} 代替()
比如下面的例子
object Test {
def f(a:Int) = {a}
def main(args: Array[String]) {
val a = f{15} // 這里用{}代替()
println(a)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/91496.html
標籤:Spark
下一篇:為什么AWS CDN的統計報告里,"Percentage of Viewer Requests by Result Type",總和并不是100%啊,在
