Scala:仅将某些内容附加到不可变列表中

时间:2018-03-09 05:54:16

标签: scala scala-collections scalaz scala-cats

所以说我们给了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 += _)
}

但我想使用不可变结构。

3 个答案:

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

类似于flattenflatMap

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的所有非空元素。