如何修复模式匹配穷举警告?

时间:2014-07-15 06:55:14

标签: list scala pattern-matching scala-collections

一些scala代码:

val list = List(Some("aaa"), Some("bbb"), None, ...)

list.filter(_!=None).map {
  case Some(x) => x + "!!!"
  // I don't want to handle `None` case since they are not possible
  // case None
}

当我运行它时,编译器会抱怨:

<console>:9: warning: match may not be exhaustive.
It would fail on the following input: None
                  list.filter(_!=None).map {
                                   ^
res0: List[String] = List(aaa!!!, bbb!!!)

如何在不提供case None行的情况下修复该警告?

5 个答案:

答案 0 :(得分:11)

如果您在map之后使用filter,则可以使用collect

list collect { case Some(x) => x + "!!!" } 

答案 1 :(得分:3)

您可以使用flatten

scala> val list = List(Some("aaa"), Some("bbb"), None).flatten
list: List[String] = List(aaa, bbb)

scala> list.map {
     |   x => x + "!!!" 
     | }
res1: List[String] = List(aaa!!!, bbb!!!)

答案 2 :(得分:1)

您可以使用@unchecked注释,但这需要一些额外的代码:

list.filter(_!=None).map { x => ( x : @unchecked) match {
  case Some(x) => x + "!!!"
 }
}

答案 3 :(得分:0)

您可以使用get方法代替模式匹配  以下是示例代码:

scala> val list = List(Some("aaa"), Some("bbb"), None)
list: List[Option[String]] = List(Some(aaa), Some(bbb), None)
scala> list.filter(_ != None).map(_.get + "!!!")
res0: List[String] = List(aaa!!!, bbb!!!)

答案 4 :(得分:0)

解决此问题的其他方法,没有filterpattern matching

scala> list.flatten map (_ + "!!!") 

scala> list.flatMap (_ map (_ + "!!!"))