You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala插值字符串模板:如何消除Option为None时的空行?

Scala字符串模板处理可选属性空行问题

问题描述

需要将包含可选属性的对象以类JSON格式通过字符串模板输出:属性为None时不显示对应内容,为Some时显示标签与值。示例代码如下:

case class FooTest(a: String, b: Option[String], c: String)
val test = FooTest("one", Some("two"), "three");

val myTemplate = s"""
| "een" : "${test.a}"
| ${test.b.fold(""){tb => s"\"twee\": \"$tb\""}
| "drie" : "${test.c}"
"""

当test.b为Some("value")时输出符合预期,但为None时会留下多余空行:

"een" : "one"

"drie" : "three"

需在不替换连续换行符的前提下消除该空行。

解决方案

方案1:将换行整合到可选内容中

调整字符串模板,把换行符放到fold的返回值里,仅当属性有值时才输出换行+键值对,否则输出空字符串:

val myTemplate = s"""
| "een" : "${test.a}"
|${test.b.fold(""){tb => s"\n\"twee\": \"$tb\""}}
| "drie" : "${test.c}"
""".stripMargin

当test.b为None时,fold返回空字符串,对应位置不会生成额外换行,从根源避免空行问题。

方案2:构建有效行列表后拼接

先收集所有非空的键值对行,再用换行符连接,这种方式逻辑清晰,扩展性更强:

case class FooTest(a: String, b: Option[String], c: String)
val test = FooTest("one", None, "three")

// 收集所有有效行:Option类型用map转换,flatten自动过滤None项
val lines = List(
  Some(s""""een" : "${test.a}""""),
  test.b.map(tb => s""""twee": "$tb""""),
  Some(s""""drie" : "${test.c}""""),
).flatten

val myTemplate = lines.mkString("\n")

运行后输出无空行的结果:

"een" : "one"
"drie" : "three"

后续新增可选属性时,只需在列表中添加对应项即可,无需修改拼接逻辑。

内容的提问来源于stack exchange,提问作者dr jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:18:27