Ваш код неверен, потому что вы создаете новый итератор на каждой итерации цикла while (фактически вы создаете два из них). Каждый новый итератор будет указывать на начало коллекции result
. Таким образом, вы создали бесконечный цикл.
Чтобы это исправить, вызовите result.iterator()
только один раз и сохраните результат в переменной.
Но даже лучше (лучше читать, меньше подвержено ошибкам) был бы цикл for-each, который (почти всегда) является предпочтительным вариантом для перебора коллекций:
for (IdentityM im : (Collection<IdentityM>)result) {
identityMemoPairs.add(Pair.of(im.identity,im.memo));
}
Компилятор автоматически преобразует это в код, используя итератор, поэтому никакой разницы в производительности. Как правило, производительность не является проблемой при итерации по коллекции, если вы избегаете нескольких плохих вещей, таких как вызов get(i)
для LinkedList
.
Обратите внимание, что компилятор выдаст вам предупреждение, которое не имеет ничего общего с итерацией, но с использованием необработанного типа Collection
(вместо Collection<IdentityM>
). Проверьте, действительно ли handler.getResult()
возвращает Collection<IdentityM>
и измените тип переменной result
на это, если это возможно.
Другой вопрос, нужен ли вам этот список, чтобы быть списком пар. Обычно использование простых парных классов не рекомендуется, потому что их имя не показывает значение объекта, который они представляют. Например, вместо Pair<String, String>
лучше использовать класс PersonName
, в котором есть поля для имени и фамилии. Почему вы не можете просто использовать List<IdentityM>
? И если вы можете использовать это, вы уверены, что не можете использовать Collection<IdentityM>
? (List
и Collection
часто взаимозаменяемы.) Тогда вы можете вообще избежать копирования.