【问题标题】:How to convert nested sequences to a sequence of tuples?如何将嵌套序列转换为元组序列?
【发布时间】:2018-06-07 15:07:50
【问题描述】:

这是我之前的question 的后续。

假设我现在有一个这样的数据结构:

case class C()

case class B(cs: Seq[C])

case class A(bs: Seq[B])

您将如何编写函数 A => Seq[(A, Option[B], Option[C])]
该函数应该像这样工作:

A(Nil)              // Seq((Some(A()), None, None))
A(Seq(B(Nil)))      // Seq((Some(A()), Some(B()), None))
A(Seq(B(Seq(C())))) // Seq((Some(A()), Some(B()), Some(C()))

在这种情况下,monad 转换器有用吗?

【问题讨论】:

    标签: scala collections


    【解决方案1】:

    我相信这可以满足您的需求 - 基于之前的 answer 类似问题:

    def foo(a: A): Seq[(A, Option[B], Option[C])] =
      toOptions(a.bs).flatMap(optB =>
        optB
          .map(b => toOptions(b.cs))
          .getOrElse(Seq(None))
          .map(optC => (a, optB, optC))
      )
    
    // always returns a non-empty list - with None as the only value for empty input
    def toOptions[T](s: Seq[T]): Seq[Option[T]] = s.headOption +: s.drop(1).map(Some(_))
    

    【讨论】:

    • 我认为这段代码有一个小错误。我猜.getOrElse(Seq()) 应该替换为.getOrElse(Seq(None))。对吗?
    • 哦,完全正确,我会编辑来解决这个问题。谢谢。
    【解决方案2】:

    您的基本map/flatMap 组合以及针对None 条件的额外测试。

    def unwind(a:A) :Seq[(A, Option[B], Option[C])] = {
      if (a.bs.isEmpty) Seq((a,None,None))
      else a.bs.flatMap{ b =>
        if (b.cs.isEmpty) Seq((a,Some(b),None))
        else b.cs.map(c => (a,Some(b),Some(c)))
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多