所以说我们给了List[String]
一堆Option[String]'s
给他们a, b, c
。假设我想将Options[String]'s
中的有效(一些' s)a, b, c
附加到我现有的List[String].
中。使用不可变结构的最佳方法是什么?
即。我知道我可以使用ListBuffer并执行以下操作:
def foo(a: Option[String], b: Option[String], c: Option[String]) : ListBuffer[String] = {
val existingList = new ListBuffer("hey")
a.map(_ => existingList += _)
b.map(_ => existingList += _)
c.map(_ => existingList += _)
}
但我想使用不可变结构。
答案 0 :(得分:4)
在选项列表中使用.flatten
并将其附加到列表
val existingList = List(1, 2, 3)
val a = Some(4)
val b = None
val c = Some(5)
val newList = existingList ::: List(a, b, c).flatten
答案 1 :(得分:0)
def foo(a: Option[String], b: Option[String], c: Option[String]): List[String] =
List("hey") ++ a.toList ++ b.toList ++ c.toList
类似于flatten
或flatMap
。
scala> foo(Some("a"), None, Some("c"))
res1: List[String] = List(hey, a, c)
定义像这样的通用函数更好:
def foo[T](xs: Option[T]*) : List[T] =
xs.toList.flatten
scala> foo(Some("a"), None, Some("c"))
res2: List[String] = List(a, c)
答案 2 :(得分:-1)
允许val list = List("A", "B", "C")
和val opts = = List(Some("X"), None, Some("Y"), None, Some("Z"))
。然后,list ++ opts.filter(_.isDefined).map(_.get)
将为List("A", "B", "C", "X", "Y", "Z")
提供list
的所有元素和opts
的所有非空元素。