web-dev-qa-db-ja.com

Scalaに文字列が空白か存在しないか確認してください

を持っています Option[String]

文字列が存在するかどうか、また存在するかどうかを確認します。

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

Scalaでこれを行うより良い方法はありますか?

24
Soumya Simanta

existsを使用して確認する必要があります。そのようです:

myOption.exists(_.trim.nonEmpty)

Trueを返すのは、Option[String]Noneではなく、空でもありません。

47
wheaties

パターンマッチングに基づくアプローチ、

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

空のオプションのフィルターは空のオプションになるため、これも機能するはずです

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

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
2
prayagupd

以下を渡すと、提案されたすべてのソリューションが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
2
karol.bu

私は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)
}
1
oleksii

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."))
}
1
Andrii Abramov

それで遊ぶためにScalafiddleを追加しました: Scalafiddle

これは、マークされた正しい答えが間違っていることを示しています(prayagupdが指摘したとおり)。

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

解決策は非空白用です:

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