我有一些使用Rhino引擎在Java7上运行的JavaScript代码。现在,我想将代码迁移到Java 8(因此使用Nashorn引擎执行它)。限制是,JavaScript代码应该只以一种方式进行更改,使其仍然可以在Java7和Rhino上运行。
现在我正在努力使用Array.prototype.forEach()函数。我多次使用以下模式:
myJavaObject.getJavaSet().toArray().forEach(
function(element){
foo(element);
}
}
由于Rhino似乎使用JavaArray作为JavaScript数组并运行JavaScript Array.prototype.forEach()函数,因此这种方法在Rhino上运行得很好。
相反,我发现我需要在Iterable接口类型的对象上运行Java8的forEach函数。
myJavaObject.getJavaSet().forEach(
function(element){
foo(element);
}
}
总而言之,第一个代码片段在Java 7和Rhino上运行良好(但不能在Java 8和Nashorn上运行),第二个代码片段在Java 8(但不是7)上运行良好。
因为我需要一个在两个引擎上都能运行的代码,所以这两个选项都不是解决方案。我发现了第三种方法,它实际上在两个引擎上运行,即for each循环:
for each (element in myJavaObject.getJavaSet().toArray()){
foo(element);
}
但由于"for each“循环已被弃用,我宁愿使用另一种解决方案,以免在不久的将来再次迁移我的代码。所以我正在寻找一个更好的解决方案来解决同时运行在Java7和Java8上的forEach循环。谢谢你的任何想法!
发布于 2015-04-15 14:25:13
如果它是由Java集合支持的,我建议使用以下代码:
var iterator = myJavaObject.getJavaSet().iterator();
while (iterator.hasNext()) {
print(it.next());
}
https://stackoverflow.com/questions/27989239
复制相似问题