2017-05-19 5 views
1

Ich versuche, ScriptEngine zu verwenden, um von einer Zeichenfolge in eine Lambda-Funktion für die Eingabe zu konvertieren. Dies ist, was ich habe, so weit kommen, aber ich nur Fehler auftreten:Konvertieren von Zeichenfolge in Lambda

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

Sie mögen vielleicht den 'javascript' Tag zu Ihrer Frage hinzufügen. –

Antwort

1

JavaScript Syntax für einen Lambda-Ausdruck ist x => x + 3 oder äquivalent können Sie es als eine anonyme Funktion function(x) { return x + 3; } schreiben. Beachten Sie, dass es sich von der Java-Syntax für einen Lambda-Ausdruck x -> x + 3 leicht unterscheidet.

So versuchte ich engine.eval("x => x + 3");, aber bekam eine Ausnahme von der Skript-Engine. Ich verstehe nicht warum.
Aber mit

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

Sie eine JavaScript-Funktion Objekt bekommen kann. Dann müssen Sie dies in ein Java-Funktionsobjekt (alias Lambda-Ausdruck) konvertieren.

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

und dann tun, was immer Sie

someFunctionThatTakesInALambdaExpression(f); 
+0

Das funktioniert gut. Die Syntax "x => x + 3" funktioniert auch nicht für mich. Nicht sicher warum ... –

+0

"x => x + 3" scheint gut zu funktionieren. y = eval ("x => x + 3"); y (3); // druckt 6 aus – junvar