【问题标题】:Converting List[JsObject] to JsArray with Fold使用 Fold 将 List[JsObject] 转换为 JsArray
【发布时间】:2013-10-25 00:20:36
【问题描述】:

可以在这里使用foldList[JsObject] 转换为JsArray吗?

    def getJsonArray(list: List[JsObject]): JsArray = {
        def go(l: List[JsObject], acc: JsArray) : JsArray = l match {
            case x :: xs => go(xs, acc ++ Json.arr(x))
            case Nil => acc
        }
        go(list, JsArray())
    }

【问题讨论】:

    标签: scala recursion playframework


    【解决方案1】:

    是的,这应该大致等价:

      def getJsonArray(list: List[JsObject]): JsArray = {
        list.foldLeft(JsArray())((acc, x) => acc ++ Json.arr(x))
      }
    

    【讨论】:

    • 谢谢。为什么选择 foldLeft 而不是 foldRight?
    • foldRight 从列表的头部开始构建一个巨大的函数直到最后,然后应用可能导致堆栈溢出的函数。 foldLeft 从列表的头部开始并应用您的函数,然后转到下一个元素,这样您就没有可能导致堆栈溢出的巨大构建函数。要获得更好的答案,您可以在这里查看stackoverflow.com/questions/1446419/…
    • 为什么不用(acc, x) => acc +: x
    • 我想你的意思是acc :+ x,我只是从问题中复制了提供的函数
    • 像这样使用 fold 将结果累积到不可变的 JsArray 中,这意味着为列表中的每个元素构造一个新的 JsArray 对象。没有更好的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多