【问题标题】:How to convert/wrap a sequence in scala to an Option[Seq] so that if the list is empty, the Option is None如何将scala中的序列转换/包装为Option [Seq],以便如果列表为空,则Option为None
【发布时间】:2017-02-24 18:13:27
【问题描述】:

我可以使用 if 语句来做到这一点,但可能有一种“scala”方式来做到这一点。

  def notScalaConv(in: Seq[String]): Option[Seq[String]] = {
    if (in.isEmpty)
      None
    else
      Option(in)
  }

【问题讨论】:

  • if 是 Scala 中的一个表达式,这在其他语言中并不常见:以这种方式使用它在我看来“scalaish”
  • 正如您所写,您的if 不起作用,因为单分支if 的值始终为Unit。我已通过添加else 对其进行更正。

标签: scala scala-option


【解决方案1】:

您可以将Seq 提升为Option,然后对其进行过滤。像这样:

 def notScalaConv(in: Seq[String]): Option[Seq[String]] = {
     Option(in).filter(_.nonEmpty)
 }

【讨论】:

  • 最好使用nonEmpty而不是双重否定。
  • @MichaelZajac 这就是它的名称。我用我的快速搜索找不到它。谢谢:)
【解决方案2】:

你为什么不简单地做val seqOpt = Option(yourSeq),它会给你Option(Seq[String])

  val nonEmpty = Seq("somevalue")
  val empty = Seq()

  val seqOpt = List(Option(empty), Option(nonEmpty)) map {
    case seq if seq.get.isEmpty => None
    case x => x
  }

  assert(seqOpt.head == None)
  assert(seqOpt(1) == Option(nonEmpty))

【讨论】:

  • Option[Seq[Nothing]] != None。它只给你一个Seq[Nothing],因为你没有在Seq()中指定类型参数。
  • 这个答案没有意义。
猜你喜欢
  • 2021-08-31
  • 2019-03-03
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2016-08-10
相关资源
最近更新 更多