2012-11-22 30 views
2

可能重复:
Underscore in List.filter布尔谓语较短的形式

这个工程(按预期):

List(true, false, true).filter(_ == true).foreach(println) 

,但我不能这样写:

List(true, false, true).filter(_).foreach(println) 

为什么?

+0

相关:http://stackoverflow.com/questions/13518677/partially-applied-functions-在-斯卡拉 –

回答

8

@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) 

通知最后一种情况是如何工作的,因为我们包括的_前面!运营商,因此它知道你使用它作为一个匿名的参数,而不是使用它部分应用该功能。

2

只是为了换个角度,这取决于你的目标是什么,这只是短而简洁:

for(a <- List(true, false, true) if a) println(a)