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