如何在 Nashorn 中调用带参数的匿名函数?
How can I call an anonymous function with arguments in Nashorn?
我正在尝试使用我在 Java.
中定义的 Nashorn 为 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
不接受任何参数 - 那么如何将参数传递给这个匿名函数?
Runnable.run
当然不接受任何参数。只需使用 Consumer<Object>
:
public void each(Object[] arr, Consumer<Object> function) {
for(Object o : arr) function.accept(o);
}
(或定义您自己的功能接口并使用它。)
我正在尝试使用我在 Java.
中定义的 Nashorn 为 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
不接受任何参数 - 那么如何将参数传递给这个匿名函数?
Runnable.run
当然不接受任何参数。只需使用 Consumer<Object>
:
public void each(Object[] arr, Consumer<Object> function) {
for(Object o : arr) function.accept(o);
}
(或定义您自己的功能接口并使用它。)