Отбросить вложенный вариант в Kotlin стрелке - PullRequest
1 голос
/ 08 мая 2020

У меня есть значение с типом ниже в моем классе данных

Option<Option<List<Pair<String, Option<String>>>>>

Как мне получить доступ к самому правому Option<Sring>. Я пробовал использовать выражение when, как показано ниже

when(Option<Option<List<Pair<String, Option<String>>>>>) {
is Some -> when(Option<Option<List<Pair<String, Option<String>>>>>.t) {
           is Some -> when(Option<List<Pair<String, Option<String>>>>.t) {
......

, но оно выглядит не очень хорошо. Есть ли другой способ отказаться от этих опций

Ответы [ 2 ]

2 голосов
/ 08 мая 2020
val t: Option<Option<List<Pair<String, Option<String>>>>> =
    Some(Some(listOf(
         Pair("a", Some("A")),
         Pair("b", Some("B")),
         Pair("c", None)
    )))

val l = t.flatten()
         .map { list ->
             list.map { pair -> pair.second }
         }
         .getOrElse { emptyList() }

val first = l.getOrElse(0) { None }
val second = l.getOrElse(1) { None }
val missing = l.getOrElse(7) { None }
1 голос
/ 08 мая 2020
nested  // Option<Option<List<Pair<String, Option<String>>>>>
  .flatten() // Option<List<Pair<String, Option<String>>>>
  .map { it.map { it.second() } } // Option<List<Option<String>>>
  .sequence(Option.applicative()) // Option<Option<List<String>>>
  .flatten() // Option<List<String>>

flatten избавляется от вложенных параметров, а sequence изменяется с List<Option<A>> на Option<List<A>>.

...