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

时间:2018-12-04 14:48:16

标签: scala

我正在尝试创建一个字符串列表,然后使用use_backend bk-%[hdr(host),lower,map_dom(/etc/haproxy/host_to_backend.map,bk_default)] if { path_req ^/(yada|info)/.*$ }

将它们连接起来
mkstring

输出

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

我想使用可变列表。 解决方案已尝试

abca;abcb1

我可以执行空检查。我们可以对其进行重构以更好地消除if和else

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

任何人都可以帮助

1 个答案:

答案 0 :(得分:2)

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

您在误用foldLeft。要记住的关键是,您传入一个函数,该函数接受一个累加器和“当前元素”以及一个种子值,并将“当前”步骤的结果作为“种子”或累加器输入。下一步。

从顶部开始阅读:

  • 带我的List(“ a”,“ b1”)列表
  • 从空字符串""开始作为累加器
  • 对于列表中的每个元素,针对累加器的“当前”值调用该函数。
  • 在上述情况下,将“当前”元素连接到现有累加器。
  • 将结果作为种子值传递给下一步。

在您的示例中,没有+=,因为您没有对值进行变异,而是“当前步骤”的返回将是下一步的初始累加器值,这都是不可变的。 / p>

实际上是:  -步骤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 ";"