簡體   English   中英

使用Nashorn遍歷數組

[英]Iterating over array with Nashorn

使用Java的內置javascript解釋器時,為什么我可以使用Arrays.forEach()遍歷Java列表,而不能遍歷本機數組? 我有以下測試代碼

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

我希望將其打印出來

abc ABC

但是我得到了

ABC

TypeError:[Ljava.lang.String; @ 644e4fbf在第14行沒有這樣的函數“ forEach”

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

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

我遇到的問題是我的JavaScript代碼想要調用返回String []的Java函數,而我希望像處理常規javascript數組那樣處理結果對象。 有沒有比在Java中編寫包裝程序函數(將我的數組轉換為ArrayList)更簡單的方法來解決此問題?

在Java列表上調用forEach時,您正在調用從Iterable繼承的List的forEach方法。 Nashorn支持在需要@FunctionalInterface對象時傳遞腳本函數,因此您可以將函數作為Consumer參數的參數傳遞。 Java數組上沒有這樣的forEach Java方法,因此第二次forEach方法調用失敗。

請注意,JavaScript Array.prototype的Nashorn實現。 forEach是通用的。 它也適用於Java數組和列表。 我將腳本調整為對Java List和Java String array使用Array.prototype.forEach。

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

感謝您的建議。 這不僅涉及遍歷數組,而且編寫腳本的人們可能希望調用諸如Arrays.sort(),Arrays.filter()等函數。

最后,我決定更改所有Java函數,以使它們通過幫助函數傳遞來調用Java.from(),從而返回真正的JavaScript數組,而不是本機Java數組:

private JSObject toJavascript(Object javaObject)
{
    String tmpkey = "tmp"+javaObject.hashCode()+System.currentTimeMillis();
    engine.put(tmpkey, javaObject);
    JSObject jsObject = (JSObject)engine.eval("Java.from("+tmpkey+")");
    engine.put(tmpkey, null);
    return jsObject;
}

這樣做可能更整潔,但至少看來可行!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM