道歉,如果这很明显,但是我是scala的新手,并且使用以下代码遇到了两种意外行为:
Seq(1, "a", 2, "b") map {
case i: Int => i+1
}
1)我本来希望重新获得一个集合,在该集合中字符串不变,数字递增1,但我却报错。
2)我相信case i: Int => i + 1
语法代表为Ints定义的部分函数。但是看来map需要一个总函数,那么为什么还要编译呢?编译器帮助我会更好吗?最好将运行时异常移至编译时间异常。
map()
不会将部分函数用作传递的参数,但collect()
会这样做。
Seq(1, "a", 2, "b") collect {
case i: Int => i+1
}
//res0: Seq[Int] = List(2, 3)
请注意,未为部分函数定义的输入是如何不传递而是被丢弃的。您不希望删除的内容需要一个处理程序,即使它只是case _ =>
默认处理程序。
Seq(1, "a", 2, "b", 'z') collect {
case i: Int => i+1 //increment ints
case c: Char => c.toUpper //capitalize chars
case s: String => s //strings pass through
}
//res0: Seq[Any] = List(2, a, 3, b, Z)
当您将部分函数传递给map()
编译器时,不会抱怨trait PartialFunction[-A, +B] extends (A) => B
。换句话说,部分函数是一种函数。
值得注意的是,在处理部分函数时...
呼叫者有责任在致电
isDefinedAt
之前致电apply
...
因此,我们可以得出结论,那就是这样collect()
做,而map()
不是。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句