Scala 从ListMap调用动态字符串

Scala 从ListMap调用动态字符串,scala,Scala,我有一些包含字符串的嵌套列表映射。对于其中一些字符串,我想返回当前时间。我是scala新手,但我觉得该语言是围绕“函数作为变量”主题构建的,这应该是可能的。到目前为止,我有下面的代码,但是它在定义时求值,而我希望它在每次读取值时求值 val sql_dynamic = ListMap("user_history_create_date" -> {(new SimpleDateFormat("yyyy-MM-dd")).format(new Date())}, "fan_h

我有一些包含字符串的嵌套列表映射。对于其中一些字符串,我想返回当前时间。我是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())});

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

您可以尝试以下方法:

val sql_dynamic = ListMap("foo" -> (() => new SimpleDateFormat("yyyy-MM-dd").format(new Date())))
println(sql_dynamic.get("foo").get.apply())
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)  
    }
}
在这里,我添加了一个
Function0[String]
作为映射的值,只有当我取出并显式应用它时,才会应用它

编辑 作为对您评论的回应,将不属于某个常见类型的值放入映射中是一个坏主意。你可以这样做来解决这个问题:

val sql_dynamic = ListMap("foo" -> (() => new SimpleDateFormat("yyyy-MM-dd").format(new Date())))
println(sql_dynamic.get("foo").get.apply())
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)  
    }
}

我想你要找的是
def
关键字:

def
定义一个函数(如果您在类的主体中,则定义一个方法)
val
定义一个常数
var
定义一个变量

正如您在本示例中所看到的,在每次调用时都会对函数进行求值:


我想这和我想做的很接近。唯一的问题是我正在查看这个列表映射,其中其他值是静态字符串,因此我无法对这些值调用.get.apply()。据我所知,这是匹配{}有用的地方。您提到这个新代码返回一个Function0[String],所以我将for循环更改为返回[String,Object],并编写了以下代码:val sv=v match{case s:String=>s case f:Function0[String]=>f.get.apply()},但是我得到了两个编译错误。一种说法是:type pattern()=>String中的非变量类型参数字符串是未选中的,因为它是通过擦除消除的。另一个说:value get不是()=>String[error]案例f:Function0[String]=>f.get.apply()的成员是的,我同意这不是个好主意。99%的时间它都是静态的,而且会有大量的重构,只有一种情况下我必须阅读它。