检查字符串是否为空或Scala中是否不存在

时间:2014-06-06 16:21:28

标签: string scala option

我有Option[String]

我想检查是否存在字符串,如果存在则不是空白。

def isBlank( input : Option[String]) : Boolean = 
{ 
     input.isEmpty || 
     input.filter(_.trim.length > 0).isEmpty 
}

在Scala中有更好的方法吗?

9 个答案:

答案 0 :(得分:46)

您应该使用exists进行检查。像这样:

myOption.exists(_.trim.nonEmpty)
当且仅当True不是Option[String]且不为空时,

才会返回None

答案 1 :(得分:4)

基于模式匹配的方法,

def isBlank( input : Option[String]) : Boolean = 
  input match {
    case None    => true
    case Some(s) => s.trim.isEmpty
  }

答案 2 :(得分:3)

这应该也可以,因为过滤空选项会导致空选项

def isBlank( input : Option[String]) : Boolean =  
   input.filter(_.trim.length > 0).isEmpty 

答案 3 :(得分:2)

如果传递:

,所有提议的解决方案都会因NullPointerException而崩溃
val str : Option[String] = Some(null). 

因此,空检查是必须

def isBlank(input: Option[String]): Boolean = 
  input.filterNot(s => s == null || s.trim.isEmpty).isEmpty

答案 4 :(得分:2)

exists(接受的解决方案)将在输入中至少包含一个元素时工作,即Some("")但不是None时。

exists检查至少有一个元素(x)是否适用于此功能。

例如

scala> List[String]("apple", "").exists(_.isEmpty)
res21: Boolean = true

//if theres no element then obviously returns false
scala> List[String]().exists(_.isEmpty)
res30: Boolean = false

Option.empty相同,因为其中没有元素,

scala> Option.empty[String].exists(_.isEmpty)
res33: Boolean = false

所以forall是确保该函数应用所有元素的原因。

scala> def isEmpty(sOpt: Option[String]) = sOpt.forall(_.trim.isEmpty)
isEmpty: (sOpt: Option[String])Boolean

scala> isEmpty(Some(""))
res10: Boolean = true

scala> isEmpty(Some("non-empty"))
res11: Boolean = false

scala> isEmpty(Option(null))
res12: Boolean = true

粗略的方法是过滤nonEmpty字符串,然后检查option.isEmpty

scala> def isEmpty(sOpt: Option[String]) = sOpt.filter(_.trim.nonEmpty).isEmpty
isEmpty: (sOpt: Option[String])Boolean

scala> isEmpty(None)
res20: Boolean = true

scala> isEmpty(Some(""))
res21: Boolean = true

答案 5 :(得分:1)

我来自C#后台,发现Scala隐式方法类似于C#扩展

import com.foo.bar.utils.MyExtensions._
...

"my string".isNullOrEmpty  // false
"".isNullOrEmpty           // true
" ".isNullOrEmpty          // true
"  ".isNullOrEmpty         // true

val str: String  = null
str.isNullOrEmpty          // true

<强>实施

package com.foo.bar.utils

object MyExtensions {

  class StringEx(val input: String) extends AnyVal {

    def isNullOrEmpty: Boolean =    
      if (input == null || input.trim.isEmpty)
        true
      else
        false
  }

  implicit def isNullOrEmpty(input: String): StringEx = new StringEx(input)
}

答案 6 :(得分:1)

您还可以利用Extractor pattern。它使代码更具声明性。

例如:

object NonBlank {
  def unapply(s: String): Option[String] = Option(s).filter(_.trim.nonEmpty) 
}

然后像使用它

def createUser(name: String): Either[Error, User] = name match {
  case NonBlank(username) => Right(userService.create(username))
  case _ => Left(new Error("Invalid username. Blank usernames are not allowed."))
}

答案 7 :(得分:0)

我添加了一个Scalafiddle来玩:Scalafiddle

这表明标记的正确答案是错误的(正如prayagupd所指出的):

def isBlank(str: Option[String]): Boolean =
   str.forall(_.trim.isEmpty)

解决方案是非空白的:

def isNotBlank(str: Option[String]): Boolean =
   str.exists(_.trim.nonEmpty)   

答案 8 :(得分:0)

您还可以使用lastOptionheadOption

进行检查

如果字符串为空,则将返回None

scala> "hello".lastOption
res39: Option[Char] = Some(o)

scala> "".lastOption
res40: Option[Char] = None