从ListMap调用动态字符串

时间:2013-06-21 17:19:14

标签: scala

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

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

2 个答案:

答案 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