2017-03-27 148 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); 
} 

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