forEach - 从Rhino迁移到Nashorn?

时间:2015-01-16 17:14:20

标签: java javascript foreach rhino nashorn

我有一些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循环寻找更好的解决方案。感谢您的任何想法!

1 个答案:

答案 0 :(得分:0)

如果它由Java集合支持,我建议使用它:

var iterator = myJavaObject.getJavaSet().iterator();
while (iterator.hasNext()) {
    print(it.next());
}