代码之家  ›  专栏  ›  技术社区  ›  coder25

向左折叠以创建不可变列表

  •  0
  • coder25  · 技术社区  · 6 年前

    我试图创建一个字符串列表,然后使用 mkstring

    List("a", "b1")
        .foldLeft(ListBuffer.empty[String]) { (a, l) =>
        {
          if (StringUtils.isNotBlank(l))
            a += "abc" +l
          else a
        }
        }
        .mkString(";")
    

    产量

    abca;abcb1

    我想用一个可变的列表。 尝试解决

    List("a", "b1").
    foldLeft(List[String]())((b,a) => b:+"abc"+a).mkString(";")
    

    我可以执行空检查。我们可以重构它以更好地去掉if和else吗

       List("a", "b1","","c2").
       foldLeft(List[String]())((b,a) =>
        if (StringUtils.isNotBlank(a))
         b:+"abc"+a
        else b
    ).mkString(";")
    

    谁能帮忙

    1 回复  |  直到 6 年前
        1
  •  2
  •   flavian    6 年前
    List("a", "b1").foldLeft("") { case (acc, el) => acc + el }
    

    你有点误用了 foldLeft . 要记住的关键是传递一个函数,该函数接受一个累加器和“当前元素”以及一个种子值,并将“当前”步骤的结果作为下一步的“种子”或累加器馈送。

    从上面看:

    • 拿我的清单(“A”,“B1”)。
    • 从空字符串开始 "" 作为蓄能器
    • 对于列表中的每个元素,针对累加器的“current”值调用函数。
    • 在上述情况下,将“current”元素连接到现有的累加器。
    • 将结果作为种子值传递到下一步。

    没有 += 就像在您的示例中一样,由于您没有改变值,所以返回的“当前步骤”将是下一步的初始累加器值,它都是不可变的。

    实际上: -步骤0: acc = "" , el = "a" 所以你得到 "" + "a" = "a" (这是下一阶段的ACC值) -步骤1: acc = "a" , el = "b1" 所以你得到 "a" + "b1" = "ab1"

    空线也不值什么 是字符串串联的零元素,因此检查是否为空时没有值。

    对于您的具体示例:

    List("a", "b1").foldLeft("") { case (acc, el) =>
      if (el.isEmpty) acc else acc + "abc" + el
    }
    

    在你的情况下,收集可能更好

    l.collect {
      case s if s.nonEmpty =>  "abc" + s
    } mkString ";"