我有以下代碼片段,不知何故我讓它作業了。但是,我不明白這些線路是如何作業的
val x = List.range(1, 10)
val evens1 = x.filter((i: Int) => i % 2 == 0) // I understand this , closure is passed as a function variable to filter function
val isEven = (i: Int) => i % 2 == 0
val evens = x.filter(i =>isEven(i)) // this is working, but i didnt understand this
val evens1 = x.filter(isEven(i))//why this is not working, how we can make this work
val evens2 = x.filter(isEven)//this works
uj5u.com熱心網友回復:
因此,對于所有的情況下請記住,filter是一個方法上List,它接受一個函式作為引數。
val evens = x.filter((i: Int) => i % 2 == 0)
這是使用 lambda 語法創建一個函式。
PS:這可以簡化為:
val evens = x.filter(i => i % 2 == 0)
// No need to provide the type of i, it is inferred by the context.
你甚至可以像這樣簡化它:
val evens = x.filter(_ % 2 == 0)
// No need to name the parameter if it is only used once.
但我個人不建議濫用_語法,因為它可能會令人困惑。
val isEven = (i: Int) => i % 2 == 0
這將使用 lambda 語法創建一個函式并將其存盤在isEven變數中。
val evens = x.filter(i => isEven(i))
這和第一個完全一樣;一個拉姆達。這種情況是多余的,因為 lambda 的主體只是一個函式呼叫。
這就是為什么你也可以這樣做:
val evens = x.filter(isEven)
最后,這個:
val evens1 = x.filter(isEven(i))
不會作業,因為這是一個編譯錯誤,因為在i任何地方都沒有定義變數;即使會有一個,那么這也會失敗,因為filter期望一個Int => Boolean并且isEven(i)會回傳一個普通的Boolean
我們如何才能做到這一點
無法使其作業,因為您想要的不是有效的語法。
...
好吧,你可以這樣做:
val evens = x.filter(isEven(_))
// Which would be equivalent to:
val evens = x.filter(i => isEven(i))
或者也許你可以做這樣的事情:
def createPredicateEqualsTo(to: Int): Int => Boolean =
i => i == to
val allTwos = x.filter(createPredicateEqualsTo(2))
But, this is way different to what you had since now I have a method that returns a function and I am calling it with a constant to create a predicate which will be passed down to filter
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327810.html
標籤:斯卡拉
上一篇:將ArrayType列傳遞給SparkScala中的UDF
下一篇:sbt無法匯入apache庫
