2013-06-21 57 views
1

我有一些包含字符串的嵌套ListMaps。對於這些字符串中的一些,雖然我想返回當前時間。我對scala很陌生,但我覺得這個語言是圍繞這個「函數作爲變量」的主題構建的,這應該是可能的。到目前爲止,我有下面的代碼,但是它在定義時進行評估,而我希望在每次讀取值時進行評估。從ListMap調用動態字符串

val sql_dynamic = ListMap("user_history_create_date" -> 
    {(new SimpleDateFormat("yyyy-MM-dd")).format(new Date())}, 
    "fan_history_create_time" -> 
    {(new SimpleDateFormat("HH:mm:ss")).format(new Date())}); 

我試圖使這些匿名函數「定義」的嘗試各種語法,但只有管理編譯錯誤。

回答

1

你可以嘗試這樣的事:

val sql_dynamic = ListMap("foo" -> (() => new SimpleDateFormat("yyyy-MM-dd").format(new Date()))) 
println(sql_dynamic.get("foo").get.apply()) 

在這裏,我加入了Function0[String]作爲地圖的價值,當我把它弄出來也只會被應用,並明確其應用

編輯 作爲對您的評論的迴應,將值放入不屬於某種常見類型的地圖是一個壞主意。你可以解決,通過做這樣的事情:

trait DateString{ 
    def date:String 
} 

case class StaticDateString(date:String) extends DateString 

class FunctionDateString(func:() => String) extends DateString{ 
    def date = func() 
} 

object DateTest{ 
    def main(args: Array[String]) { 
     val sql_dynamic = ListMap(
     "foo" -> new FunctionDateString(() => new SimpleDateFormat("yyyy-MM-dd").format(new Date())), 
     "bar" -> StaticDateString("2013-01-01") 
    ) 
     println(sql_dynamic.get("foo").get.date) 
     println(sql_dynamic.get("bar").get.date) 
    } 
} 
+0

我覺得這是非常接近我想要做的。唯一的是我正在查看其他值爲靜態字符串的ListMap,因此我無法在這些字段上調用.get.apply()。根據我的理解,這是匹配{}可能有用的地方。你提到的這個新的代碼返回一個Function0 [字符串],所以我改變了我的for循環返回[字符串,對象]寫了這樣:VAL SV = V匹配{ \t \t \t \t \t \t \t如果s:字符串=>小號 \t \t \t \t \t \t \t方案F:Function0 [字符串] => f.get.apply() \t \t \t \t \t \t} –

+0

但是我得到兩個編譯錯誤。一種說法是:類型pattern()=>中的非變量類型參數String由於通過擦除消除,因此未選中字符串。另一個說:value get不是()=> String [error] case f:Function0 [String] => f.get.apply() –

+0

是的,我同意它不是一個好主意。 99%的時間將會是靜態的,並且會有大量的重構,並且只有一個邊界情況我必須讀取它。 –

1

我想你正在尋找的是def關鍵字:

def定義功能(或方法,如果你在身體一個類)
val限定恆定
var限定可變

正如你在這個例子中看到的功能在每個呼叫進行評估:

scala> def fun = java.util.Calendar.getInstance().getTime() 
fun: java.util.Date 

scala> println(fun) 
Fri Jun 21 19:33:12 CEST 2013 

scala> println(fun) 
Fri Jun 21 19:33:14 CEST 2013