Option[String] 情况下的 Scala 大小写模式匹配错误

标签 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(", ")
}

我收到一条警告说

warning: non-variable type argument String in type pattern Option[String] is unchecked since it is eliminated by erasure

当我传递参数时

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

我遇到了错误

scala.MatchError: Some(what) (of class scala.Some) at $anonfun$makeAddress$1.apply(:12) at $anonfun$makeAddress$1.apply(:12)

我应该如何创建同样支持 Option[String] 的函数?

最佳答案

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

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

collect相当于filter结合map。

关于Option[String] 情况下的 Scala 大小写模式匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42944455/

相关文章:

Scala:仿射变换

scala - 与 Akka 不匹配的消息会发生什么?

scala - 对连续元素具有类型约束的列表

scala - Spark 和 Scala : Apply a function to each element of an RDD

scala - 如何替换 Scala 列表中的第一个匹配项?

scala - 合并元组的 Seq 并迭代它们

scala - 为什么 Spark 会失败并出现 java.lang.OutOfMemoryError : GC overhead limit exceeded?

scala - 使用 sbt native-packager 修改 rpm 的安装目录

scala - 如何从build.gradle文件调用scala方法

scala - Scala 如何处理包含 JVM 原始值的元组?