Я использую Scala отражение и набор инструментов для оценки динамической функции в виде строки.И я пытаюсь оценить это с данными типа List[HashMap[String, Double]]
Но это дает ошибку
Can't unquote List[scala.collection.immutable.HashMap[String,Double]], consider
using ...
val dataAfterFunctionApplied = tb.eval(q"$functionSymbol.function($data)")
Код, который я использую, как показано ниже.
package test
import scala.collection
import scala.collection.immutable.HashMap
import scala.reflect.runtime.universe.{Quasiquote, runtimeMirror}
import scala.tools.reflect.ToolBox
object ReflectionTest {
def main(args: Array[String]): Unit = {
val mirror = runtimeMirror(getClass.getClassLoader)
val tb = ToolBox(mirror).mkToolBox()
val data = List(
HashMap("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0),
HashMap("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0),
HashMap("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0),
HashMap("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0)
)
println("Data before function applied on it")
println(data.mkString(","))
val function = "def function(result: List[HashMap[String, Double]])={result.map(x=>(x('a'.toString)+x('b'.toString)))}"
val functionWrapper = "object FunctionWrapper { " + function + "}"
val functionSymbol=tb.define(tb.parse(functionWrapper).asInstanceOf[tb.u.ImplDef])
val dataAfterFunctionApplied = tb.eval(q"$functionSymbol.function($data)")
println("Data after function applied on it")
}
}
Если я использую Map
(тип данных) вместо HashMap
, то это работает, но время, затрачиваемое на анализ и оценку, слишком велико.Итак, я пытаюсь сделать это с HashMap
.
Но, к сожалению, получаю эту ошибку.
Работает с картой, ничего страшного.Но проблема производительности наступает из-за разбора набора инструментов и оценки от строки к коду.Любой эффективный способ разобрать строку в коде в Scala ??