1

我有一些包含字符串的嵌套 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())});

我尝试了各种语法来尝试使这些匿名函数“定义”,但只管理编译错误。

4

2 回答 2

1

你可以尝试这样的事情:

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

在这里,我将 aFunction0[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)  
    }
}
于 2013-06-21T17:24:56.223 回答
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
于 2013-06-21T17:33:31.433 回答