Scala: добавить только некоторые в неизменный список

Скажем, нам дали List[String] и куча Option[String]'s позвони им a, b, c, Скажем, я хочу добавить действительные (некоторые) Options[String]'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 ответа

Использование .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,

Другие вопросы по тегам