使用 Nashorn 迭代数组

Rol*_*olf 2 javascript java arrays nashorn

使用 java 的内置 javascript 解释器时,为什么我可以使用 Arrays.forEach() 迭代 java List 而不是本机数组?我有以下测试代码

var ArrayList = Java.type('java.util.ArrayList');
var list = new ArrayList();
list.add('a');
list.add('b');
list.add('c');

var StringArray = Java.type("java.lang.String[]");
var array = new StringArray(3);
array[0] = "A";
array[1] = "B";
array[2] = "C";

list.forEach(function(v) { print(v); });
array.forEach(function(v) { print(v); });
Run Code Online (Sandbox Code Playgroud)

我希望打印出来

美国广播公司

但我得到了

美国广播公司

类型错误:[Ljava.lang.String;@644e4fbf 在第 14 行没有这样的函数“forEach”

以下工作,但为什么不 array.forEach() ?

for (var i=0; i<array.length; ++i)
  print(array[i]);
Run Code Online (Sandbox Code Playgroud)

我的问题是我的 javascript 代码想要调用大量返回 String[] 的 java 函数,并且我想处理结果对象,就好像是一个常规的 javascript 数组一样。有没有比在java中编写大量包装函数来将我的数组转换为ArrayList更简单的方法来解决这个问题?

A. *_*jan 6

当您在 Java 列表上调用 forEach 时,您正在调用从Iterable继承的列表的 forEach 方法。Nashorn 支持在需要@FunctionalInterface对象时传递脚本函数,因此您可以将函数作为Consumer参数的参数传递。Java 数组上没有这样的 forEach Java 方法,因此第二个 forEach 方法调用失败。

请注意 JavaScript Array.prototype 的 Nashorn 实现。forEach是通用的。它也适用于 Java 数组和列表。我调整了您的脚本以将 Array.prototype.forEach 用于 Java List 和 java String 数组。

var ArrayList = Java.type('java.util.ArrayList');
var list = new ArrayList();
list.add('a');
list.add('b');
list.add('c');

var StringArray = Java.type("java.lang.String[]");
var array = new StringArray(3);
array[0] = "A";
array[1] = "B";
array[2] = "C";

var forEach = Array.prototype.forEach;

forEach.call(list, function(v) { print(v); });
forEach.call(array, function(v) { print(v); });
Run Code Online (Sandbox Code Playgroud)