【问题标题】:How to convert a Some(" ") to None in one-line?如何在一行中将 Some(" ") 转换为 None?
【发布时间】:2012-03-05 15:18:13
【问题描述】:

我要定义一个函数:

def convert(x: Option[String]): Option[String] = ...

xSome(str)且修剪后str为空时,将转换为None,否则为带有修剪字符串的Some

所以,测试用例将是:

convert(Some("")) == None
convert(Some("  ")) == None
convert(None) == None
convert(Some(" abc ")) == Some("abc")

我可以这样写:

def convert(x: Option[String]): Option[String] = x match {
  case Some(str) if str.trim()!="" => Some(str.trim())
  case _ => None
}

但我希望能找到一个更简单的实现(单行)。

【问题讨论】:

  • 您的环境中是否缺少换行符?你得到的报酬与你写的行数成反比吗?我的建议是只使用两行版本并停止为自己工作:-)
  • 我只是想让我的代码简单明了
  • @paxdiablo:这是一个有效的问题,因为示例确实可以改进:代码运行str.trim 两次,这显然是要避免的。
  • @Freewind,您可能会发现 this 很有用。
  • 我对找到一种更好的做事方式没有任何问题。我唯一的问题是人们浪费时间试图将三行函数转换为单行函数。这些人显然手头有太多时间 :-) 回想起来,问题中的关键词可能是“更简单”,但过度强调了“一行”这个短语,即我为什么评论。

标签: scala


【解决方案1】:

这个呢:

def convert(x: Option[String]) = 
    x.map(_.trim()).filterNot(_.isEmpty())

更新:@JamesMoore@PeterSchmitz 建议的替代语法:

x map {_.trim} filterNot {_.isEmpty}
x map (_.trim) filterNot (_.isEmpty)

【讨论】:

  • 对不起,convert(Some(" abc ")) != Some("abc")
  • 我认为如果你去掉括号会更容易阅读:x map {_.trim} filterNot {_.isEmpty}
  • 我认为如果你使用圆括号而不是卷曲的括号会更容易阅读:D x map (_.trim) filterNot (_.isEmpty)
  • @JamesMoore:感谢您的意见,我添加了您的建议来回答。相反,我发现它比括号更容易阅读;-)。
  • 如果您想将修剪后的空字符串映射到 None,但不实际修剪字符串,请使用以下变体:x filterNot (_.trim.isEmpty)
【解决方案2】:

和往常一样,还有 for comprehension 替代语法(它是 filter 和 map 的语法糖)

 def convert(o: Option[String]): Option[String] = 
    for (x <- o if !x.isEmpty) yield x

【讨论】:

  • 更像是句法醋
【解决方案3】:

def convert(x: Option[String]) = x.filter(s => s.trim.nonEmpty)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2016-11-29
    • 2012-04-14
    • 2020-06-21
    • 2016-05-31
    相关资源
    最近更新 更多