所以假设我们得到了一个List[String]
和一堆Option[String]'s
称它们为a, b, c
。假设我想将a, b, c
外的有效(某些(Options[String]'s
附加到我现有的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 += _)
}
但我想使用不可变的结构。
在选项列表中使用 .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
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)
让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
的所有非空元素。