[英]scala coding-style: initialize a val Seq depending on optional values
我正在開發一個簡單的函數,它應該根據可能不存在的可選參數構建一個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 ") + " "
}
不要重復自己:
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}")
另一種方法是保持可變構造,但隱藏在一個塊中以避免副作用:
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中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.