Scala collection type for filter

北战南征 提交于 2019-12-10 00:44:49

问题


Assume you have a List(1,"1") it is typed List[Any], which is of course correct and expected. Now if I map the list like this

scala> List(1, "1") map {
     |   case x: Int => x
     |   case y: String => y.toInt
     | }

the resulting type is List[Int] which is expected as well. My question is if there is an equivalent to map for filter because the following example will result in a List[Any]. Is this possible? I assume this could be solved at compile time and possibly not runtime?

scala> List(1, "1") filter {
     |   case x: Int => true
     |   case _ => false
     | }

回答1:


Scala 2.9:

scala> List(1, "1") collect {
     |   case x: Int => x
     | }
res0: List[Int] = List(1)



回答2:


For anyone stumbling across this question wondering why the most-voted answer doesn't work for them, be aware that the partialMap method was renamed collect before Scala 2.8's final release. Try this instead:

scala> List(1, "1") collect {
     |   case x: Int => x
     | }
res0: List[Int] = List(1)

(This should really be a comment on Daniel C. Sobral's otherwise-wonderful answer, but as a new user, I'm not allowed to comment yet.)




回答3:


With regard to your modified question, if you simply use a guard in the case comprising your partialFunction, you get filtering:

scala> val l1 = List(1, 2, "three", 4, 5, true, 6)
l1: List[Any] = List(1, 2, three, 4, 5, true, 6)

scala> l1.partialMap { case i: Int if i % 2 == 0 => i }
res0: List[Int] = List(2, 4, 6)


来源:https://stackoverflow.com/questions/2218558/scala-collection-type-for-filter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!