【问题标题】:Cast away nested Option in Kotlin arrow抛弃 Kotlin 箭头中的嵌套选项
【发布时间】:2020-05-08 16:45:29
【问题描述】:

我的数据类中有以下类型的值

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

如何访问最右边的Option&lt;Sring&gt;。我试过使用下面的 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) {
......

但看起来不太好。有没有其他方法可以抛弃那些选项

【问题讨论】:

  • 你希望得到 List
  • @JakubZalas 对“Option”的右侧部分用于特定列表索引

标签: kotlin arrow-kt


【解决方案1】:
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 }

【讨论】:

    【解决方案2】:
    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 去掉了嵌套选项,sequenceList&lt;Option&lt;A&gt;&gt; 变为 Option&lt;List&lt;A&gt;&gt;

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 1970-01-01
      • 2021-03-25
      • 2020-05-07
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      相关资源
      最近更新 更多