折叠处理角落案例的功能方法

Sou*_*nta 3 functional-programming scala fold

我有一个节点列表(String),我想将其转换为以下内容.

create X ({name:"A"}),({name:"B"}),({name:"B"}),({name:"C"}),({name:"D"}),({name:"F"})
Run Code Online (Sandbox Code Playgroud)

使用折叠我最后得到一些额外的",".我可以使用最终String上的子字符串删除它.我想知道在Scala中是否有更好/更实用的方法吗?

  val nodes = List("A", "B", "B", "C", "D", "F")

  val str = nodes.map( x => "({name:\"" + x + "\"}),").foldLeft("create X ")( (acc, curr) => acc + curr )
  println(str)

 //create X ({name:"A"}),({name:"B"}),({name:"B"}),({name:"C"}),({name:"D"}),({name:"F"}),
Run Code Online (Sandbox Code Playgroud)

Kig*_*gyo 6

解决方案1

您可以使用该mkString功能,该功能不会在末尾附加分隔符.

在这种情况下,您首先将每个元素映射到相应的String,然后使用mkString将','放在中间.

由于"create X"在开始时它是静态的,你可以将它添加到结果中.

val str = "create X " + nodes.map("({name:\"" + _ + "\"})").mkString(",")
Run Code Online (Sandbox Code Playgroud)

解决方案2

另一种看待这种情况的方法:由于你只追加一个','太多,你可以删除它.

val str = nodes.foldLeft("create X ")((acc, x) => acc + "({name:\"" + x + "\"}),").init
Run Code Online (Sandbox Code Playgroud)

init只取一个集合中的所有元素,除了最后一个.(字符串在这里被视为字符集合)

因此,如果您的元素中存在元素nodes,则会删除",".如果没有,您只能获得"create X "并因此移除可能不需要的空白区域.

nodes空的时,解决方案1和2不等效.解决方案1将保留空白区域.

  • 如果你想用超级Scala方式做,你可以使用占位符`... map("({name:\""+ _ +"\"})")...` (3认同)