2016-10-27 12 views
6

często widzę te dwa wzory na dołączenie opcjonalnego wartość do SEQ:Clean Scala składnia „Dołącz wartość opcjonalna SEK jeśli istnieje”

def example1(fooList: Seq[Foo], maybeFoo: Option[Foo]): Seq[Foo]) = { 
    if (maybeFoo.isDefined) 
    fooList :+ maybeFoo.get 
    else 
    fooList 
} 

def example2(fooList: Seq[Foo], maybeFoo: Option[Foo]): Seq[Foo]) = { 
    maybeFoo match { 
    case Some(foo) => fooList :+ foo 
    case None => fooList 
    } 
} 

Obie te metody działają, ale wydaje się rozwlekły i brzydki. Czy istnieje istniejący operator lub metoda, aby zrobić to bardziej naturalnie/funkcjonalnie?

Dzięki!

+1

Jeśli chcesz tylko do linii strumienia podejście masz, możesz napisać 'fooOpt.map (fooSeq : + _). getOrElse (fooSeq) 'również. –

Odpowiedz

17

Opcja niejawnie konwertuje do sekwencji z 1 lub 0 elementów tak następujących prac:

scala> val opt = Some("a") 
opt: Some[String] = Some(a) 

scala> val nope = None 
nope: None.type = None 

scala> val seq = Seq("a", "b", "c") 
seq: Seq[String] = List(a, b, c) 

scala> seq ++ opt 
res3: Seq[String] = List(a, b, c, a) 

scala> seq ++ nope 
res4: Seq[String] = List(a, b, c) 
4
maybeFoo.foldLeft(fooList)(_ :+ _) 
Powiązane problemy