javascript - 使用 Nashorn 遍历数组

标签 javascript java arrays nashorn

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

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); });

我希望打印出来

a b c A B C

但是我得到了

a b c

TypeError: [Ljava.lang.String;@644e4fbf has no such function "forEach" in at line number 14

以下有效,但为什么 array.forEach() 无效?

for (var i=0; i<array.length; ++i)
  print(array[i]);

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

最佳答案

当您在 Java List 上调用 forEach 时,您正在调用从 Iterable 继承的 List 的 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); });

关于javascript - 使用 Nashorn 遍历数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44833161/

相关文章:

javascript - 在一页上进行多个 imageLoaded 调用,并确保每个调用都已完成,然后再继续

java : corrupted zip file created when copy using nio

java - 添加数据后刷新表

javascript - 在两个不同的 json 数组中合并相同的特定 json 对象

python - 在 Numpy 中取消选择不删除的列

javascript - Knockout.js 中 observableArray 对象中计算属性的奇怪行为

javascript - 如何区分类中的每个复选框元素

java - 如何从二维数组列表中获取值

c# - formcollection如何访问html表单关联数组

javascript - 使用 IFrame 时将 JS 放在哪里