如何从java 8中的js函数获取数组输出?

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;
 }
Run Code Online (Sandbox Code Playgroud)

我想将一个数组从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());
    }
Run Code Online (Sandbox Code Playgroud)

我能够看到avg js函数的输出,但我不知道如何从java中的js avg函数获取js输出数组

任何支持表示赞赏.

最诚挚的问候,Aurelian

Aln*_*tak 7

返回类型来自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);
 }
Run Code Online (Sandbox Code Playgroud)

输出:

1.1305
1.2255
1.3855
1.5955
1.7054999999999998
1.8155000000000001
1.9255
1.5354999999999999
Run Code Online (Sandbox Code Playgroud)