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
,