2017-03-27 149 views
2

我想在Javascript中使用Nashorn来执行每个函数,这是我在Java中定义的。我如何在Nashorn中调用带有参数的匿名函数?

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没有任何参数 - 所以我怎么能传递参数给这个匿名函数?

+0

对于那些试图找出这个工作:** JS:**测试(功能(){打印(一个); }); ** Java:** public void test(Consumer test){test.accept(“yo”); } *打印“哟”。* – Andrew

回答

2

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

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

(或自定义功能接口和使用。)