模式匹配检查字符串是否为空或空字符串

25

使用match函数可以检查字符串是否为空或null吗?

我想做如下操作:

def sendToYahoo(message:Email) ={
  val clientConfiguration = new ClientService().getClientConfiguration()
  val messageId : Seq[Char] = message.identifier
  messageId match {
    case messageId.isEmpty => validate()
    case !messageId.isEmpty => //blabla
  }
}

但是我遇到了编译错误。

提前感谢。

3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
54

你可以编写一个简单的函数,例如:

def isEmpty(x: String) = Option(x).forall(_.isEmpty)
或者
def isEmpty(x: String) = x == null || x.isEmpty

如果您认为" "也是空的话,您可能还想要削减字符串。

def isEmpty(x: String) = x == null || x.trim.isEmpty

然后使用它

val messageId = message.identifier
messageId match {
  case id if isEmpty(id) => validate()
  case id => // blabla
}

或者没有匹配

if (isEmpty(messageId)) {
  validate()
} else {
  // blabla
}

甚至更多

object EmptyString {
  def unapply(s: String): Option[String] =
    if (s == null || s.trim.isEmpty) Some(s) else None
}

message.identifier match {
  case EmptyString(s) => validate()
  case _ => // blabla
}

1
修剪的好主意!它经常被忽视。 - Madoc
not . exists == forall - kiritsuku
这样不是更好吗? def isEmpty(x: String) = x == null || Option(x.trim).forall(_.isEmpty) - sowen
@sowen 哎呀,逻辑条件上有错误,谢谢指出。我已经更新了我的解决方案。 - Gabriele Petronella
将公共成员的类型选项添加到以下代码中:def isEmpty(x: String): Boolean = Option(x).forall(_.isEmpty) - Markus

13
def isNullOrEmpty[T](s: Seq[T]) = s match {
     case null => true
     case Seq() => true
     case _ => false
}

1
Scala语言设计者如果提供了一个带有isNull方法的isNullable特质,那么我们的Scala新手的生活将会变得更加容易,例如: def isNull[T](obj: T) = obj match { case null => true case _ => false } - Yordan Georgiev

1

如果您想要检查一个字符串是否为null或空,这里有一个一行代码可以实现。您可以将其包装在Option中,使用filter确保它不是一个空字符串,然后调用getOrElse来提供一个默认值,以防原始值既为null,又为空字符串。

Option(s).filter(!_.isEmpty).getOrElse(columnName)

1
虽然这段代码可能解决了OP的问题,但强烈建议您提供更多关于为什么和/或如何回答问题的背景信息。仅提供代码回答通常在长期运行中变得毫无意义,因为未来的观众无法理解解决方案背后的推理。 - E. Zeytinci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,