использовать перечисления в операторах for-each без ограничения оперативной памяти? - PullRequest
0 голосов
/ 09 февраля 2011

Привет, у меня есть около 10 миллионов значений и я получаю Enumeration в расширенном цикле for, но он взрывает мою оперативную память.Есть ли способ получить итерацию вместо перечисления.

Я пытаюсь найти альтернативу для Collections.list () и Collections.enumeration ().

Ответы [ 2 ]

1 голос
/ 09 февраля 2011
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
public final class Enumerations {

    /**
     * Allows using of {@link Enumeration} with the for-each statement. The
     * implementation is not using any heap space and such is able to serve
     * virtually endless Enumerations, while {@link Collections#list} is limited
     * by available RAM. As a result, this implementation is much faster than
     * Collections.list.
     * 
     * @param enumeration
     *            The original enumeration.
     * @return An {@link Iterable} directly calling the original Enumeration.
     */
    public static final <T> Iterable<T> iterable(final Enumeration<T> enumeration) {
        return new Iterable<T>() {
            public final Iterator<T> iterator() {
                return new Iterator<T>() {
                    public final boolean hasNext() {
                        return enumeration.hasMoreElements();
                    }

                    public final T next() {
                        return enumeration.nextElement();
                    }

                    /**
                     * This method is not implemeted as it is impossible to
                     * remove something from an Enumeration.
                     * 
                     * @throws UnsupportedOperationException
                     *             always.
                     */
                    public final void remove() {
                        throw new UnsupportedOperationException();
                    }
                };
            }
        };
    }

}
0 голосов
/ 09 февраля 2011

Я часто использую трюк, который может помочь, скажем, у вас есть метод, который берет коллекцию.

 populate(List<String> list);

, и вы не хотите менять метод, но знаете, что он использует только add() метод.Вы можете сделать следующее

 List<String> list = new ArraysList<String>() {
    public boolean add(String text) {
        myProcess(text);
        return false;
    }
 };
 populate(List<String> list);

В этом случае заполнение может добавить любой объем данных без использования дополнительной памяти.

...