2017-05-19 59 views
1

我试图使用ScriptEngine从字符串转换为输入的lambda函数。这是我想出到目前为止,但我只遇到错误:从字符串转换为lambda

ScripEngine engine = new ScriptEngineManager().getEngineByName("javascript"); 
someFunctionThatTakesInALambdaEquation((Function<Double, Double>)engine.eval("x -> x + 3")); 
+0

您可能会在'javascript'标记添加到您的问题。 –

回答

1

JavaScript的一个lambda表达式语法是x => x + 3,或者等价地,你可以把它写成匿名函数function(x) { return x + 3; }。 请注意,它与lambda表达式x -> x + 3的Java语法略有不同。

所以我尝试engine.eval("x => x + 3");,但从脚本引擎得到一个异常。我不明白为什么。
但随着

AbstractJSObject obj = (AbstractJSObject) engine.eval("function(x) { return x + 3; }"); 

你可以得到一个JavaScript函数对象。然后,您需要将其转换为Java函数对象(aka lambda表达式)。

Function<Double, Double> f = x -> (Double) obj.call(null, x); 

,然后做你喜欢什么都

someFunctionThatTakesInALambdaExpression(f); 
+0

这工作得很好。 “x => x + 3”语法也不适用于我。不知道为什么... –

+0

“x => x + 3”似乎正常工作。 y = eval(“x => x + 3”); Y(3); //打印出6 – junvar