Должен ли Spliterator использоваться повторно после того, как функция Consumer выдает исключение? - PullRequest
0 голосов
/ 04 мая 2018

Spliterator принимает произвольную функцию Consumer в своих методах tryAdvance и forEachRemaining.

Каким должно быть состояние разделителя, если потребитель выбрасывает исключение? Если потребитель передал forEachRemaining, то выбрасывает исключение после 10 элементов (которое затем распространяется и перехватывается), если следующий вызов tryAdvance в разделителе возвращает 11-й элемент, или разделитель считается мертвым и недействительным в этот момент?

Javadocs неоднозначны в этом вопросе; они просто говорят, что будут распространяться любые исключения, без ссылки на состояние разделителя после этой точки

1 Ответ

0 голосов
/ 04 мая 2018

Я считаю, что вы не должны идти дальше после неудачи.

Сплитератор прекращает свою работу и больше не перебирает элементы. Даже если есть оставшиеся элементы.

Исключение в forEachRemaining для определенного элемента означает, что вычисление для всей группы закончено.

Обход и расщепление выхлопных элементов; каждый Spliterator полезен только для одного массового вычисления.

Пример того, как Spliterators.ArraySpliterator справляется с этим.

Spliterator<String> spliterator = Arrays.asList("a", "b", "c").spliterator();
System.out.println(spliterator.estimateSize());

try {
    spliterator.forEachRemaining(s -> {
        if (s.equals("b")) {
            throw new IllegalArgumentException();
        }
        System.out.println(s);
    });
} catch (IllegalArgumentException e) {}

System.out.println(spliterator.estimateSize());
spliterator.forEachRemaining(System.out::println);

3
a
0

AFAIK, большинство Spliterator s, основанных на коллекции / массиве, работают таким образом.

...