将任何scala集合转换为同一集合的Option
的最惯用方法可能是什么,而当集合为空时,选项为None
,否则只有{{1}原来的?
哦,没有制作scala,就可以为这个简单的转换创建整个集合的内存副本。
Some
适合将Option.apply
翻译为类型null
的{{1}},这是一个很好的传统争用实用程序,但对寻求以下语义的惯用scala无用:
Option
答案 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中出现在其他一些上下文中的方法,例如Try
有toOption
方法。
答案 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第一名。