我有一些包含字符串的嵌套ListMaps。对于其中一些字符串虽然我想返回当前时间。我是scala的新手,但我觉得这种语言是围绕这个“作为变量”的主题构建的,这应该是可行的。到目前为止,我有下面的代码,但它在定义时进行评估,而我希望每次读取值时进行评估。
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())});
我尝试使用各种语法尝试使这些匿名函数“定义”,但只有托管编译错误。
答案 0 :(得分: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)
}
}
答案 1 :(得分: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