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

问题描述 投票:23回答:7

我有一个Option[String]

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

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

在Scala中有更好的方法吗?

string scala option
7个回答
46
投票

你应该做的是使用exists检查。像这样:

myOption.exists(_.trim.nonEmpty)

当且仅当True不是Option[String]并且不是空的时候将返回None


4
投票

一种基于模式匹配的方法,

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

3
投票

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

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

2
投票

如果传递,所有提议的解决方案都会因NullPointerException而崩溃:

val str : Option[String] = Some(null). 

因此必须进行无效检查:

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

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

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)
}

0
投票

我添加了一个Scalafiddle来玩:Scalafiddle

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

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

解决方案是非空白的:

def isNotBlank(str: Option[String]): Boolean =
   str.exists(_.trim.nonEmpty)   
© www.soinside.com 2019 - 2024. All rights reserved.