Nashorn使用乐观类型(自JDK
8u40起),因此在不需要双精度时将使用整数。因此,您不能指望它返回Double。
同样,
5*x^2在Javascript中的意思是“五倍x两倍”。该
**幂运算符是Javascript语言的较新版本定义,但犀牛不支持它。
如果将Javascript代码更改为
5*x*x可以运行,但是这样做会更安全:
total += 0.001 * ((Number)engine.eval(function)).doublevalue();
编译常用代码
由于您是在循环中反复调用此函数,因此最佳实践是提前编译该函数。性能优化不是严格必要的,但因为引擎每次都必须编译您的函数(尽管它可能使用缓存来帮助您完成此工作)。
import javax.script.Compilable;import javax.script.Compiledscript;import javax.script.Invocable;import javax.script.scriptContext;Compiledscript compiledscript = ((Compilable)engine) .compile("function func(x) { return " + function + "}");compiledscript.eval(compiledscript.getEngine() .getBindings(scriptContext.ENGINE_SCOPE));Invocable funcEngine = (Invocable) compiledscript.getEngine();// . . .total += 0.001 * ((Number)funcEngine.invokeFunction("func", i)).doublevalue();使用ES6语言功能
将来,Nashorn确实支持该
**运营商时,如果要使用它,则可能需要打开如下ES6功能:
import jdk.nashorn.api.scripting.NashornscriptEngineFactory;NashornscriptEngineFactory factory = new NashornscriptEngineFactory();scriptEngine enjin = factory.getscriptEngine("--language=es6");或像这样:
java -Dnashorn.args=--language=es6
*编辑以考虑注释中指出的数学修正。



