2017-05-19 63 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