Ответ 1
Жаль, что flatten
не существует. Это должно быть.
Теперь сглаживание существует.
Как и раньше,
s getOrElse None
(в дополнение к другим ответам) также будет делать то же самое.
Скажем, у меня есть val s: Option[Option[String]]
. Таким образом, он может иметь следующие значения:
Some(Some("foo"))
Some(None)
None
Я хочу уменьшить его, чтобы первый стал Some("foo")
, а два других стали None
. Очевидно, есть много способов сделать это, но я ищу простой, возможно, встроенный, менее один-лайнер.
Жаль, что flatten
не существует. Это должно быть.
Теперь сглаживание существует.
Как и раньше,
s getOrElse None
(в дополнение к другим ответам) также будет делать то же самое.
Вы можете использовать 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.
s.flatten
за которым следует куча символов, чтобы довести меня до минимума, что stackoverflow позволяет
Я думаю, что преобразование в Iterable просто отлично. Используйте эти шаги, чтобы перейти от Option[Option[String]
к одному Option[String]
s.flatten.headOption
(который возвращает Option[String]
)
Вы можете использовать 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]
.
Ну, я действительно не понимаю, почему это может быть просто Нет (третий случай). Если это действительно может быть просто "Нет", я бы проголосовал за ответ Рекса Керра, иначе просто будет достаточно .get:
scala> Some(Some("foo")).get
res0: Some[java.lang.String] = Some(foo)
scala> Some(None).get
res1: None.type = None