Un-optioning option option Option

Скажем, у меня есть val s: Option[Option[String]]. Таким образом, он может иметь следующие значения:

Some(Some("foo")) Some(None) None

Я хочу уменьшить его, чтобы первый стал Some("foo"), а два других стали None. Очевидно, есть много способов сделать это, но я ищу простой, возможно, встроенный, менее один-лайнер.

+36
источник поделиться
6 ответов

Жаль, что flatten не существует. Это должно быть.

Теперь сглаживание существует.

Как и раньше,

s getOrElse None

(в дополнение к другим ответам) также будет делать то же самое.

+32
источник

Вы можете использовать scalaz join, так как это одна из монадических операций:

doubleOpt.join

Здесь он находится в REPL:

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> some(some("X")).join
res0: Option[java.lang.String] = Some(X)

scala> some(none[String]).join
res1: Option[String] = None

scala> none[Option[String]].join
res3: Option[String] = None

Он доступен для чего-либо с экземпляром typeclass для Monad.

+16
источник
s.flatten

за которым следует куча символов, чтобы довести меня до минимума, что stackoverflow позволяет

+11
источник

Я думаю, что преобразование в Iterable просто отлично. Используйте эти шаги, чтобы перейти от Option[Option[String] к одному Option[String]

s.flatten.headOption 

(который возвращает Option[String])

+4
источник

Вы можете использовать flatMap следующим образом:

val options = List(Some(Some(1)), Some(None), None)
options map (_ flatMap (a => a))

Это отобразит List[Option[Option[Int]]] в List[Option[Int]].
Если у вас есть опция, вы можете использовать ее как:

val option = Some(Some(2))
val unzippedOption = option flatMap (b => b)

Это скроет ваши Option[Option[Int]] до Option[Int].

+1
источник

Ну, я действительно не понимаю, почему это может быть просто Нет (третий случай). Если это действительно может быть просто "Нет", я бы проголосовал за ответ Рекса Керра, иначе просто будет достаточно .get:

scala> Some(Some("foo")).get
res0: Some[java.lang.String] = Some(foo)

scala> Some(None).get
res1: None.type = None
-4
источник

Посмотрите другие вопросы по меткам или Задайте вопрос