Scala字符串到带参函数的映射实现及自动执行问题求解
解决Scala Map中函数自动执行的问题
问题根源在于你当前的代码中,tagfunction(...)是直接执行函数并将返回值存入Map,所以Map初始化时所有函数都会被调用;而且每次获取map(key)拿到的是函数执行后的结果,而非函数本身,自然无法做到按需执行。
解决方案
将Map的值类型改为无参函数(闭包),让函数仅在你主动调用时执行:
修改后的Map代码
val h = scala.collection.mutable.Map( "01" -> (() => tagfunction(2, "Tag Length", "ToInt")), "02" -> (() => tagfunction(1, "Firmware version", "ToInt")), "03" -> (() => tagfunction(15, "IMEI", "ToASCII")), "04" -> (() => tagfunction(2, "Device ID", "ToInt")), "10" -> (() => tagfunction(2, "No of Archive records", "ToInt")), "20" -> (() => tagfunction(4, "Date and time", "ToInt")), //"30" -> (() => tagfunction(9, "Coordinates", "ToASCII")), //"33" -> (() => tagfunction(4, "Speed and direction", "ToASCII")), "34" -> (() => tagfunction(2, "Height", "ToSignedShort")), "35" -> (() => tagfunction(1, "HDOP", "ToInt")), "40" -> (() => tagfunction(2, "Status of device", "ToInt")), "41" -> (() => tagfunction(2, "Supply Voltage", "ToInt")), "42" -> (() => tagfunction(2, "Battery Voltage", "ToInt")), "43" -> (() => tagfunction(1, "Temperature of tracking device", "ToSignedByte")), )
调用方式
当需要执行对应键的转换逻辑时,调用无参函数:
// 仅执行"01"对应的tagfunction h("01")()
原理说明
- 用
() => tagfunction(...)将函数调用包装成一个未执行的闭包,Map初始化时只会存储这个闭包对象,不会执行内部的tagfunction。 - 只有当你调用
h(key)()时,才会触发闭包内的tagfunction执行,完全实现按需调用,不会触发其他键的函数。
内容的提问来源于stack exchange,提问作者Nagababu
相关产品推荐
相关产品推荐

