Вы понимаете, что метод Stream#foreach задает три вопроса?

Java

В JAVA8 добавлен Stream API, а Stream API предоставляет программистам метод foreach для обхода коллекции:java.util.stream.Stream#forEach.

Итак, что вы знаете об этом методе foreach? Приходите и ответьте на эти вопросы.

Вопрос 1: Является ли foreach последовательным потреблением?

Как название. Является ли foreach последовательным потреблением?

Мой ответ: не обязательно.

вызов в параллельном потокеjava.util.stream.Stream#forEachМетод не гарантирует порядок потребления элементов.

Если вам нужно обеспечить последовательное потребление элементов в параллельных потоках, вам нужно использоватьjava.util.stream.Stream#forEachOrderedметод.

foreach是顺序消费吗

Вопрос 2: Является ли foreach быстрым сбоем

Не много ерунды, переходим непосредственно к коду, видишь, значит веришь:

foreach是快速失败吗

Из примера программы мы можем узнать, что программа действительно бросаетConcurrentModificationExceptionисключение, ноjava.util.stream.Stream#forEachВремя, когда метод генерирует исключение, наступает после использования всех исходных элементов, а не в отказоустойчивом режиме, как это делают итераторы.

Вопрос 3: Что происходит, когда элементы добавляются до foreach?

Каков результат выполнения следующего кода? Будет ли это вызывать исключение?

public static void main(String[] args) {
  List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
  Stream<Integer> stream = list.stream();
  list.add(6);
  stream.forEach(System.out::println);
}

Подумайте минуту.

Правильный ответ: исключение не генерируется, и выводится измененный элемент. Результат выполнения следующий:

在foreach之前添加元素会抛异常吗

Операция

Заключительный вопрос:java.util.stream.Stream#forEachКак реализован базовый метод? Заинтересованные студенты могут самостоятельно просмотреть исходный код, а анализ исходного кода будет обновлен в следующем выпуске.


Приглашаем обратить внимание на личный публичный номер:

Coder小黑