这个工程(按预期):
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-在-斯卡拉 –