を持っています Option[String]
。
文字列が存在するかどうか、また存在するかどうかを確認します。
def isBlank( input : Option[String]) : Boolean =
{
input.isEmpty ||
input.filter(_.trim.length > 0).isEmpty
}
Scalaでこれを行うより良い方法はありますか?
exists
を使用して確認する必要があります。そのようです:
myOption.exists(_.trim.nonEmpty)
True
を返すのは、Option[String]
はNone
ではなく、空でもありません。
パターンマッチングに基づくアプローチ、
def isBlank( input : Option[String]) : Boolean =
input match {
case None => true
case Some(s) => s.trim.isEmpty
}
空のオプションのフィルターは空のオプションになるため、これも機能するはずです
def isBlank( input : Option[String]) : Boolean =
input.filter(_.trim.length > 0).isEmpty
exists
(承認されたソリューション)は、入力に少なくとも1つの要素、つまりSome("")
が含まれる場合に機能しますが、None
の場合は機能しません。
exists
は、少なくとも1つの要素(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
以下を渡すと、提案されたすべてのソリューションがNullPointerExceptionでクラッシュします。
val str : Option[String] = Some(null).
したがって、null-checkはmustです。
def isBlank(input: Option[String]): Boolean =
input.filterNot(s => s == null || s.trim.isEmpty).isEmpty
私は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)
}
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."))
}
それで遊ぶためにScalafiddleを追加しました: Scalafiddle
これは、マークされた正しい答えが間違っていることを示しています(prayagupdが指摘したとおり)。
def isBlank(str: Option[String]): Boolean =
str.forall(_.trim.isEmpty)
解決策は非空白用です:
def isNotBlank(str: Option[String]): Boolean =
str.exists(_.trim.nonEmpty)