将多个Option [T]转换为List [T]

时间:2017-04-19 04:23:25

标签: scala

我有几个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")

编辑:这是一个人为的例子,实际上我需要使用ab来实例化SomeOtherThing(a, b)并将其作为列表项。

2 个答案:

答案 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
}