aur*_*anr 1 javascript java arrays java-8 nashorn
我在test.js文件中有以下方法:
function avg(input, period) {
var output = []; 
if (input === undefined) {
      return output;
} 
var i,j=0;
 for (i = 0; i < input.length- period; i++) {
    var sum =0;
    for (j = 0; j < period; j++) {
        //print (i+j)
        sum =sum + input[i+j];
        }
    //print (sum + " -- " + sum/period)
    output[i]=sum/period;        
}
 return output;
 }
我想将一个数组从java传递给这个函数,并在java中获取js输出数组.我使用了以下java代码:
double[] srcC = new double[] { 1.141, 1.12, 1.331, 1.44, 1.751, 1.66, 1.971, 1.88, 1.191, 1.101 };
    try {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("nashorn");
        String location = "test.js";
        engine.eval("load(\"" + location + "\");");
        Invocable invocable = (Invocable) engine;
        // double[] a = (double[]) invocable.invokeFunction("avg", srcC, 2);
        System.out.println("obj " + invocable.invokeFunction("avg", srcC, 2));
    } catch (Exception ex) {
        LOGGER.error(ex.getLocalizedMessage());
    }
我能够看到avg js函数的输出,但我不知道如何从java中的js avg函数获取js输出数组
任何支持表示赞赏.
最诚挚的问候,Aurelian
返回类型来自Invocable.invokeFunction实现定义.Nashorn脚本引擎返回实现的对象的实例jdk.nashorn.api.scripting.JSObject
此接口有一个方法Collection<Object> values(),因此唯一需要的更改是转换结果invokeFunction然后提取值集合:
 JSObject obj = (JSObject)invocable.invokeFunction("avg", srcC, 2);
 Collection result = obj.values();
 for (Object o : result) {
      System.out.println(o);
 }
输出:
1.1305
1.2255
1.3855
1.5955
1.7054999999999998
1.8155000000000001
1.9255
1.5354999999999999
| 归档时间: | 
 | 
| 查看次数: | 1353 次 | 
| 最近记录: |