在对象下面过滤并映射案例类:
object PartialTest extends App {
case class c()
val l = List(c)
l.filter({ case c => true })
l.map({ case c => true })
}
是否可以明确定义filter
和map
的谓词?
像:
val myPredicate = { case c => true };
?
答案 0 :(得分:7)
当然 - filter
和map
只是采用函数的普通方法:
scala> case class C()
defined class C
scala> val l = List(C())
l: List[C] = List(C())
scala> val alwaysTrue: C => Boolean = Function.const(true)
alwaysTrue: C => Boolean = <function1>
scala> l.filter(alwaysTrue)
res0: List[C] = List(C())
(请注意,我为了惯用性而更改了一些内容,因为您可能不需要案例类的伴随对象列表。)
如果你想使用部分函数语法(case
),你也可以这样做:
scala> val anotherVersion: C => Boolean = {
| case _ => true
| }
anotherVersion: C => Boolean = <function1>
scala> l.filter(anotherVersion)
res1: List[C] = List(C())
有许多方法可以在Scala中定义函数,只要你最终得到一个具有适当输入和输出类型的函数,它们都可以工作。
答案 1 :(得分:3)
是的,以下编译:
object PartialTest extends App {
case class C()
val l = List(C())
val myPredicate: PartialFunction[C, Boolean] = {
case cv: C => true
}
l.filter(myPredicate)
l.map(myPredicate)
}
答案 2 :(得分:2)
您的想法val myPredicate = { case c => true }
的问题非常简单:为了编译匿名函数,编译器需要知道参数类型。它可以明确指定:val myPredicate = { c: C => true }
。否则,编译器需要期望类型,可以通过使用函数作为方法参数(在原始代码中发生)或通过指定myPredicate
的类型来给出(期望类型和其他2个答案一样)。这在http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#anonymous-functions中准确描述。