如何在Scala中模式匹配数组?

时间:2011-07-11 07:49:05

标签: scala

我的方法定义如下

def processLine(tokens: Array[String]) = tokens match { // ...

假设我想知道第二个字符串是否为空

case "" == tokens(1) => println("empty")

不编译。我该怎么做呢?

4 个答案:

答案 0 :(得分:104)

如果要在数组上进行模式匹配以确定第二个元素是否为空字符串,则可以执行以下操作:

def processLine(tokens: Array[String]) = tokens match {
  case Array(_, "", _*) => "second is empty"
  case _ => "default"
}

_*绑定到任意数量的元素,包括无。这类似于列表中的以下匹配,可能更为人所知:

def processLine(tokens: List[String]) = tokens match {
  case _ :: "" :: _ => "second is empty"
  case _ => "default"
}

答案 1 :(得分:7)

模式匹配可能不是您示例的正确选择。你可以这样做:

if( tokens(1) == "" ) {
  println("empty")
}

模式匹配对于以下情况更为适用:

for( t <- tokens ) t match {
   case "" => println( "Empty" )
   case s => println( "Value: " + s )
}

为每个令牌打印一些内容。

编辑:如果您想检查是否存在任何空字符串,您还可以尝试:

if( tokens.exists( _ == "" ) ) {
  println("Found empty token")
}

答案 2 :(得分:5)

更酷的是,您可以使用_*匹配的内容的别名

val lines: List[String] = List("Alice Bob Carol", "Bob Carol", "Carol Diane Alice")

lines foreach { line =>
  line split "\\s+" match {
    case Array(userName, friends@_*) => { /* Process user and his friends */ }
  }
}

答案 3 :(得分:3)

case声明不起作用。那应该是:

case _ if "" == tokens(1) => println("empty")