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
相关产品推荐
相关产品推荐

