我有Option[String]
。
我想检查是否存在字符串,如果存在则不是空白。
def isBlank( input : Option[String]) : Boolean =
{
input.isEmpty ||
input.filter(_.trim.length > 0).isEmpty
}
在Scala中有更好的方法吗?
答案 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)
您还可以使用lastOption
或headOption
如果字符串为空,则将返回None
scala> "hello".lastOption
res39: Option[Char] = Some(o)
scala> "".lastOption
res40: Option[Char] = None