如何在Nashorn中使用参数调用匿名函数?

时间:2017-03-27 13:36:04

标签: java nashorn

我正在尝试使用Nashorn为Javascript中的每个函数执行一个,我已经在Java中定义了它。

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine eng = mgr.getEngineByExtension("js");
eng.put("script", new ScriptAPI());
try {
    eng.eval("script.each([1,2,3], function(i){ print('i = ' + i); });");
} catch(ScriptException e)
{ e.printStackTrace(); }

如您所见,我的脚本正在调用script.each,其中script已被定义为ScriptAPI的一个实例,如下所示:

public class ScriptAPI {
    public void each(Object[] arr, Runnable function) {
        for(Object o : arr) function.run();
    }
}

但是,您可能已经注意到我没有将Object o传递给该函数;这是因为function.run没有接受任何参数 - 那么如何将参数传递给这个匿名函数呢?

1 个答案:

答案 0 :(得分:2)

Runnable.run当然不接受任何论点。只需使用Consumer<Object>

public void each(Object[] arr, Consumer<Object> function) {
    for(Object o : arr) function.accept(o);
}

(或者定义你自己的功能界面并使用它。)