可能重复:
List.filter 中的下划线
这有效(按预期):
List(true, false, true).filter(_ == true).foreach(println)
但我不能这样写:
List(true, false, true).filter(_).foreach(println)
为什么?
可能重复:
List.filter 中的下划线
这有效(按预期):
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)