Какой самый быстрый способ получить элементы коллекции? - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть List<Pair<String, String>>, в который я хочу скопировать данные из Collection.

Каков наилучший способ прочитать коллекцию и добавить элементы в список?

List<Pair<String, String>> identityMemoPairs = new LinkedList<Pair<String, String>>();
Collection result = handler.getResult();

    while(result.iterator().hasNext()){
         IdentityM im =(IdentityM) result.iterator().next();
         identityMemoPairs.add(Pair.of(im.identity,im.memo));
    }

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Ваш код неверен, потому что вы создаете новый итератор на каждой итерации цикла 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 часто взаимозаменяемы.) Тогда вы можете вообще избежать копирования.

0 голосов
/ 01 февраля 2012

Ваш код imho хорош как есть. Но вы, вероятно, могли бы заставить handler возвращать коллекцию пар напрямую, чтобы вы могли вызвать identityMemoPairs.addAll() вместо того, чтобы выполнять итерацию самостоятельно. Но это только делает его «красивее», но не дает большей производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...