這個工程(按預期):
List(true, false, true).filter(_ == true).foreach(println)
,但我不能這樣寫:
List(true, false, true).filter(_).foreach(println)
爲什麼?
這個工程(按預期):
List(true, false, true).filter(_ == true).foreach(println)
,但我不能這樣寫:
List(true, false, true).filter(_).foreach(println)
爲什麼?
@sshaef是對的,這是重複的。鏈接的答案是冗長但實際上,所以這裏有一個簡單的答案:
您希望list.filter(_)
擴大到像list.filter(x=>x)
,而是Scala編譯器會將其同list.filter _
,這是完全不同的。結果是在列表中部分應用filter
,而不是使用標識功能過濾列表。這是顯而易見的,當你嘗試在REPL:
scala> List(true, false, true).filter(_)
res0: (Boolean => Boolean) => List[Boolean] = <function1>
scala> List(true, false, true).filter _
res1: (Boolean => Boolean) => List[Boolean] = <function1>
scala> List(true, false, true).filter(x=>x)
res2: List[Boolean] = List(true, true)
scala> List(true, false, true).filter(identity)
res3: List[Boolean] = List(true, true)
scala> List(true, false, true).filterNot(!_)
res4: List[Boolean] = List(true, true)
通知最後一種情況是如何工作的,因爲我們包括的_
前面!
運營商,因此它知道你使用它作爲一個匿名的參數,而不是使用它部分應用該功能。
只是爲了換個角度,這取決於你的目標是什麼,這只是短而簡潔:
for(a <- List(true, false, true) if a) println(a)
相關:http://stackoverflow.com/questions/13518677/partially-applied-functions-在-斯卡拉 –