scala 模式匹配以删除某些情况

dav*_*574 0 scala pattern-matching

在 Scala 2.12 中,我使用模式匹配循环一个数组来创建一个新数组,如下所示。

val arrNew=arrText.map {
  case x if x.startsWith("A") =>x.substring(12, 20)
  case x if x.startsWith("B") =>x.substring(21, 40)
  case x => "0"
}.filter(_!="0")
Run Code Online (Sandbox Code Playgroud)

如果一个元素与两个模式之一匹配,则将一个新元素添加到新数组中arrNew。那些不匹配的将被丢弃。我的代码实际上arrText使用过滤器循环两次。如果我不包含case x =>"0",则会出现错误,抱怨某些元素未匹配。下面的代码是循环一次的唯一方法吗?有什么办法可以通过case匹配只循环一次吗?

map { x =>
      if (condition1) (output1)
      else if (condition2) (output2)
    }
Run Code Online (Sandbox Code Playgroud)

Iva*_*iuc 6

您可以使用collect

[用例] 通过将部分函数应用于定义该函数的序列的所有元素来构建新集合。


val arrNew=arrText.collect {
  case x if x.startsWith("A") =>x.substring(12, 20)
  case x if x.startsWith("B") =>x.substring(21, 40)
}
Run Code Online (Sandbox Code Playgroud)