我有一些JavaScript代码,我目前使用Rhino引擎在Java 7上运行。现在我想将代码迁移到Java 8(因此使用Nashorn引擎执行它)。约束条件是JavaScript代码只能以仍然可以在Java 7和Java 7上运行的方式进行更改。犀牛。
现在我正在努力使用Array.prototype.forEach()函数。我多次使用以下模式:
myJavaObject.getJavaSet().toArray().forEach(
function(element){
foo(element);
}
}
这适用于Rhino,因为Rhino似乎使用JavaArray作为JavaScript数组并运行JavaScript Array.prototype.forEach()函数。
然而,当使用Rhino时,这种方法不再适用。相反,我发现我需要在Iterable接口类型的对象上运行Java 8的forEach函数。所以我需要跳过调用toArray()方法:
myJavaObject.getJavaSet().forEach(
function(element){
foo(element);
}
}
总而言之,第一个代码片段可以正常运行Java 7和Rhino(但不适用于Java 8和Nashorn),第二个代码片段适用于Java 8(但不适用于7)。
由于我需要在两个引擎上运行代码,因此这两个选项都不是解决方案。我找到了第三种方法,它实际上是在两个引擎上运行,即每个循环:
for each (element in myJavaObject.getJavaSet().toArray()){
foo(element);
}
但是因为"对于每个"不推荐使用循环,我宁愿使用其他解决方案,也不必在不久的将来再次迁移我的代码。 因此,我正在为在Java 7和Java 8上运行的forEach循环寻找更好的解决方案。感谢您的任何想法!
答案 0 :(得分:0)
如果它由Java集合支持,我建议使用它:
var iterator = myJavaObject.getJavaSet().iterator();
while (iterator.hasNext()) {
print(it.next());
}