scala将列表转换为选项的惯用方法

时间:2015-10-03 10:42:14

标签: scala

将任何scala集合转换为同一集合的Option的最惯用方法可能是什么,而当集合为空时,选项为None,否则只有{{1}原来的?

哦,没有制作scala,就可以为这个简单的转换创建整个集合的内存副本。

Some适合将Option.apply翻译为类型null的{​​{1}},这是一个很好的传统争用实用程序,但对寻求以下语义的惯用scala无用:

Option

4 个答案:

答案 0 :(得分:5)

我可能只是在创建选项后使用过滤器调用:

scala> Option(List()).filter(_.isNonEmpty)
res1: Option[List[Nothing]] = None

scala> Option(List(1,2,3)).filter(_.isNonEmpty)
res2: Option[List[Int]] = Some(List(1, 2, 3))

答案 1 :(得分:4)

我觉得这不是一件普通的事情,并且无法想到任何常见的习惯方式,我可以建议添加toOption这样的方法:

implicit class OptList[A](val list: List[A]) extends AnyVal {
  def toOption: Option[List[A]] = if (list.isEmpty) None else Some(list)
}

并按如下方式使用:

scala> List().toOption
res0: Option[List[Nothing]] = None

scala> List(615, 5).toOption
res1: Option[List[Int]] = Some(List(615, 5))

toOption是scala中出现在其他一些上下文中的方法,例如TrytoOption方法。

答案 2 :(得分:3)

与Lukasz的答案类似,但更完整,适用于任何集合(我认为所有集合均来自Traversable,因为此图像建议http://i.stack.imgur.com/Dsptl.png)。

object EnrichedCollections {

  implicit class CollectionOps[A <: Traversable[_]](val collection: A) extends AnyVal {

    /**
     * Returns None if the collection is empty, otherwise returns Some of the collection
     */
    def toOption: Option[A] = if (collection.isEmpty) None else Some(collection)
  }

}

import EnrichedCollections._

assert(Nil.toOption == None)
assert(Seq(1,2).toOption == Some(Seq(1,2)))
assert(Map.empty.toOption == None)
assert(Map(1 -> "hi", 2 -> "bye").toOption == Some(Map(1 -> "hi", 2 -> "bye")))

答案 3 :(得分:0)

只是为了好玩:

val list = List(1, 2, 3, 4)
val option = list.headOption.map{_ => list}

但是,我会问你为什么要这样做...使用isEmpty是一种统一检查空列表或无值的好方法 - 你可能会发现这可以避免你必须转换为Option in第一名。