2015-06-04 2 views
2

Если я хочу, чтобы добавить значение в Option (если она есть) в список, есть лучший способ, чем:Условно добавление опции к списку

val x = Some(42) 
val xs = List(1,2,3) 
val xs2 = x match { 
    case None => xs 
    case Some(x2) => x :: xs 
} 

Я знаю, что могу использовать ++ оператор Iterable как это:

val xs2 = (x ++ xs).toList  

Но делает это явное преобразование обратно в List причины весь список проверяемых и скопировать?

ответ

1

Вы можете использовать ++: вернуть List вместо Iterable (обходя .toList вызов):

scala> val x = Some(42) 
x: Some[Int] = Some(42) 

scala> val xs = List(1,2,3) 
xs: List[Int] = List(1, 2, 3) 

scala> x ++: xs 
res4: List[Int] = List(42, 1, 2, 3) 

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

scala> x ++: xs 
res5: List[Int] = List(1, 2, 3) 
+0

Вот и все. Я забыл об этом операторе в документах. –

0

Как об этом:

val x: Option[Int] = Some(42) 
val xs = List(1,2,3) 
val xs2 = xs ++ (x match { 
    case Some(value) => List(value) 
    case None => List() 
}) 

Обратите внимание, что я должен был сказать Scala, что x является Option[Int], так что он не предполагал, что это был Some[Int] и жалуются на соответствие.

Смежные вопросы