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更简单的方法来解决这个问题?
当您在 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)
| 归档时间: |
|
| 查看次数: |
4205 次 |
| 最近记录: |