我有几个Option [T],我想将其转换为List [T]。我试图通过理解来实现这个目标:
val someOption: Option[(String, String)] = Some(("bla", "woo"))
val anotherOption: Option[String] = None
val result = for {
(a, b) <- someOption
c <- anotherOption
} yield List(a, b, c)
但是,在这种情况下,result
变为Option[List[String]]
类型且包含None
。如何让result
成为List[String]
类型,其值为List("bla", "woo")
。
编辑:这是一个人为的例子,实际上我需要使用a
和b
来实例化SomeOtherThing(a, b)
并将其作为列表项。
答案 0 :(得分:1)
一种方法:
val someOption: Option[(String, String)] = Some(("bla", "woo"))
val anotherOption: Option[String] = None
val someOptionList = for {
(a, b) <- someOption.toList
v <- List(a, b)
} yield v
val result = someOptionList ++ anotherOption.toList
或者,为了减少中间集合的构造:
val resultIter = someOption.iterator.flatMap {
case (a, b) => Seq(a,b)
} ++ anotherOption.iterator
val result = resultIter.toList
答案 1 :(得分:0)
但是,这里有一些想法。
您的代码存在的问题是,为了便于理解,您始终会使用Collection
(例如)启动它,因此在您的情况下Option
。
始终可以将另一个Collection
添加到++:
的列表中。
那么,也许是这样的事情?:
def addOptionTo(
option: Option[(String, String)],
list: List[SomeOtherThing]
): List[SomeOtherThing] = {
option.map { case (foo, bar) => SomeOtherThing(foo, bar) } ++: list
}