选项[String]中的Scala案例模式匹配错误

时间:2017-03-22 06:42:34

标签: scala

我正在尝试使用可变数量的参数

创建一个函数
def foo(args: String*)

这个函数的作用是,它消除了空字符串,并用逗号(,)分隔其余字符串。

def foo(args: String*) = {
  args.flatMap {
    case str if str.isEmpty => None
    case str => Some(str)
  }.mkString(", ")
}

当我将此函数扩展为支持Option[String]参数

def foo(args: Any*) = {
  args.flatMap {
    case str: String if str.isEmpty => None
    case str: Option[String] if str.getOrElse("").isEmpty => None
    case str => Some(str)
  }.mkString(", ")
}

我收到警告说

  

警告:非变量类型参数类型为pattern的字符串   选项[String]未选中,因为它已被删除

当我传递参数时

foo("", "Hello", Some(""), Some("what"))

我收到了错误

  

scala.MatchError:一些(什么)(类scala.Some)at   $ anonfun $ makeAddress $ 1.apply(:12)at   $ $ anonfun $ makeAddress 1.适用(12)

我该如何创建支持Option[String]的功能呢?

2 个答案:

答案 0 :(得分:3)

您可以使用收集并完全避免选项:

def foo(args: String*): String = {
  args.collect{case s if ! s.isEmpty => s}.mkString(",")
}

collect相当于filter与map的结合。

答案 1 :(得分:1)

与您的解决方案类似

def foo(args: Any*) = {
  args.flatMap {
    case str: String if !str.isEmpty => Option(str)
    case Some(str:String) if !str.isEmpty  => Option(str)
    case _ => None
  }.mkString(", ")
}