2015-01-16 2 views
0

У меня есть код JavaScript, который я сейчас запускаю на Java 7 с помощью движка Rhino. Теперь я хочу перенести код на Java 8 (и, следовательно, выполнить его с движком Nashorn). Ограничение состоит в том, что код JavaScript должен быть изменен только таким образом, что он все равно может быть запущен на Java 7 & Rhino.forEach - Миграция из Носорога в Нашрн?

Теперь я борюсь с использованием функции Array.prototype.forEach(). Я использую следующий шаблон несколько раз:

myJavaObject.getJavaSet().toArray().forEach(
    function(element){ 
     foo(element); 
    } 
} 

Это хорошо работает с Rhino, так как носорог, кажется, использовать JavaArray как JavaScript массива и выполняет функцию JavaScript Array.prototype.forEach().

Тем не менее при использовании Rhino этот подход больше не работает. Вместо этого я обнаружил, что мне нужно запустить функцию forEach Java 8 на объекте типа Iterable interface. Поэтому мне нужно, чтобы пропустить вызов метода 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); 
} 

Но так как «для каждого» цикла является устаревшим, я предпочел бы использовать другое решение, чтобы не иметь в ближайшем будущем перенастройте мой код. Итак, я ищу лучшее решение для цикла forEach, работающего как на Java 7, так и на Java 8. Спасибо за любые ваши идеи!

ответ

0

Если поддерживается коллекцией Java, я предлагаю использовать это:

var iterator = myJavaObject.getJavaSet().iterator(); 
while (iterator.hasNext()) { 
    print(it.next()); 
} 
Смежные вопросы