我正在开发一个简单的函数,它应该根据可能不存在的可选参数构建一个sql条件。
我正在尝试使用不可变的值来完成它,以及优雅和惯用的方式。
到目前为止,我带来了类似的东西:
val cond: Seq[String] = Nil ++
(if (entity != "*") Seq("entity = {entity}") else Nil) ++
(if (name != "*") Seq("name = {name}") else Nil) ++
val condition =
if (cond.size == 0) ""
else " where " + cond.mkString(" and ") + " "
所以,我只是开始使用Seqs,如果价值不存在我将它与Nil合并
使用var我得到类似的东西:
var cond: Seq[String] = Seq();
if (entity != "*") cond = cond :+ "entity = {entity}"
if (name != "*") cond = cond :+ "name = {name}"
我发现它更具可读性(我想知道第二种方法是否因为var而不是线程安全的)
我想知道什么是scala惯用和优雅的方式解决这样的事情
- 编辑
最后,我采用了这种实施方式:
val condition: String = {
var cond: Seq[String] = Seq();
if (entity != "")
cond = cond :+ "entity = {entity}"
if (filter != "")
cond = cond :+ """(name like {filter} or prev like {filter} or post like {filter})"""
if (cond.size == 0) ""
else " where " + cond.mkString(" and ") + " "
}
答案 0 :(得分:5)
不要重复自己:
def seqIf(r: String, s: String) = if (r != "*") Seq("%s = {%s}".format(s,s)) else Nil
val cond = seqIf(entity, "entity") ++ seqIf(name, "name")
不仅是字符串:
def seqIf[A](p: Boolean, a: A) = if (p) Seq(a) else Nil
val cond = seqIf(entity != "*", "entity = {entity}") ++
seqIf(name != "*", "name = {name}")
答案 1 :(得分:4)
另一种方法是保持可变构造,但隐藏在块中以避免副作用:
val cond = {
var cs = Seq[String]()
if (entity != "*") cs = cs :+ "entity = {entity}"
if (name != "*") cs = cs :+ "name = {name}"
cs
}
这样的构造非常安全,因为var
在块外无法访问。您还可以将val与可变构建器一起使用,例如ListBuffer
。在这种情况下。请确保不要将可变对象泄漏出块:
import scala.collection.mutable.ListBuffer
val cond = {
val cs = ListBuffer[String]()
if (entity != "*") cs += "entity = {entity}"
if (name != "*") cs += "name = {name}"
cs.result() //Converts the ListBuffer into an immutable List
}
这是完全可以接受的,因为块本身仍然是“纯粹的”。此模式显示在Scala API中。