Почему java.util.Iterator не сбрасывается во вложенном цикле? - PullRequest
0 голосов
/ 12 марта 2019

Когда я запускаю этот код, итератор iter становится пустым во второй раз, когда я его использую.Я инстанцирую iter каждый раз во внешнем цикле, но это не помогает!То есть после первой итерации длина итерируемой равна нулю!

Почему это так?И какова общая практика для этого сценария, которого мне не хватает?

String path = "somefile.csv";
try {
        Reader in = new FileReader(path);
        Iterable<CSVRecord> records = CSVFormat.RFC4180.withHeader(MetadataExtractorForTables.HeaderType.class)
                .withDelimiter('\t').parse(in);

        // A stupid loop
        for(int i = 0; i < 3; i++) {                
            Iterator<CSVRecord> iter = records.iterator();
            System.out.println("---> " + Iterators.size(iter));
            System.out.println("--> " + StreamSupport.stream(records.spliterator(), false).count());

            /* ----------------------------------------
             * here I would like to use the iterator
             * in a (nested) loop
             * ---------------------------------------- */
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Вывод выглядит так:

---> 191
--> 0
---> 0
--> 0
---> 0
--> 0

1 Ответ

2 голосов
/ 12 марта 2019

Потому что это злой, нарушающий контракт Iterable.

Из документов :

Невозможно вернуться назад, если запись имеетбыл проанализирован из входного потока.

Вам придется явно скопировать его в список или тому подобное.

...