簡體   English   中英

Scala是否有一種庫方法來構建考慮了空字符串的Option-s?

[英]Does Scala have a library method to build Option-s that takes into account empty strings?

我想過濾掉空字符串以將它們放入Option中。 因此,我現在快速構建了這個:

def StrictOption(s: String) = s match {
  case s if s != null && s.trim.length() > 0 => Some(s)
  case _ => None
}

問題:這可能已經在標准庫中了嗎?

我認為標准庫中沒有一種方法可以執行此操作,但是您可以比實現更簡潔。

Option(s).filter(_.trim.nonEmpty)

如果您完全關心性能,那么

if (s.trim.isEmpty) None else Some(s)

在我的基准測試中(47 vs 141),僅比Ben James的解決方案長4個字符,並且運行速度快了3倍。

沒有內置的東西。 如果性能不是問題(例如,您正在驗證用戶輸入),則Ben的篩選器是最好的簡短版本。 通常,性能不會成為問題。

另外,請注意,當您實際上不匹配任何內容時,使用match有點奇怪; 獲得if-else語句只是樣板。 說啊

if (s ne null && s.trim.length > 0) Some(s) else None

除非您想編寫自己的is-it-whitespace方法,否則它幾乎和任何東西一樣快速而簡短。 請注意, trim使用一個特殊的標准:大於\\ u0020(即'')的任何內容都不會被修剪,而等於或小於此值的任何東西都將被修剪。 因此,如果此操作的性能特別重要,那么您也可以編寫自己的修剪字符串為空的檢測器:

def ContentOption(s: String): Option[String] = {
  if (s ne null) {
    var i = s.length-1
    while (i >= 0) {
      if (s.charAt(i) > ' ') return Some(s)
      i -= 1
    }
  }
  None
}

Scala 2.13開始,對於那些不希望使用null (非Java上下文)的用戶,現在可以使用Option::unlessOption::when作為替代選項:

// val str = "hello"
Option.unless(str.isEmpty)(str)
// Option[String] = Some(hello)
Option.when(str.nonEmpty)(str)
// Option[String] = Some(hello)

// val str: String = ""
Option.unless(str.isEmpty)(str)
// Option[String] = None
Option.when(str.nonEmpty)(str)
// Option[String] = None

這也可以通過理解來實現

val res = for (v <- Option(s) if s.nonEmpty) yield v

Option(“某物”)產生Some(“某物”)

選項(空)產生無

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM