布尔谓词的缩写形式

时间:2012-11-22 23:26:34

标签: scala

  

可能重复:
  Underscore in List.filter

这有效(按预期):

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

但我不能这样写:

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

为什么?

2 个答案:

答案 0 :(得分: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)

注意最后一种情况是如何工作的,因为我们在!前面包含_运算符,因此它知道你将它用作匿名参数而不是用它来部分应用函数。

答案 1 :(得分:2)

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

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