我正在尝试创建一个字符串列表,然后使用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(";")
任何人都可以帮助
答案 0 :(得分:2)
List("a", "b1").foldLeft("") { case (acc, el) => acc + el }
您在误用foldLeft
。要记住的关键是,您传入一个函数,该函数接受一个累加器和“当前元素”以及一个种子值,并将“当前”步骤的结果作为“种子”或累加器输入。下一步。
从顶部开始阅读:
""
开始作为累加器在您的示例中,没有+=
,因为您没有对值进行变异,而是“当前步骤”的返回将是下一步的初始累加器值,这都是不可变的。 / 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 ";"