Потоки
До Java 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
Мы также можем использовать лямбда-выражения и потоки (Учебник):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
Почему forEachOrdered
, а не forEach
с потоками?
Поведение forEach
явно недетерминировано, поскольку forEachOrdered
выполняет действие для каждого элемента этого потока в порядке встречи потока, если поток имеет определенный порядок встречи. Таким образом, forEach
не гарантирует, что порядок будет сохранен.
Также при работе с потоками (особенно параллельными) помните о природе потоков. Согласно doc:
Результаты конвейера потока могут быть недетерминированными или неверными, если параметры поведения потоковых операций имеют состояние. Лямбда с отслеживанием состояния - это лямбда, результат которой зависит от любого состояния, которое может измениться во время выполнения потокового конвейера.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
Здесь, если операция сопоставления выполняется параллельно, результаты для одного и того же ввода могут отличаться от запуска к запуску из-за различий в планировании потоков, тогда как с лямбда-выражением без сохранения состояния результаты всегда будут одинаковыми.
Побочные эффекты в поведенческих параметрах потоковых операций, как правило, не приветствуются, поскольку они часто могут приводить к невольным нарушениям требования безгражданства, а также к другим угрозам безопасности потоков.
Потоки могут иметь или не иметь определенный порядок встречи. Имеет ли поток порядок встречи или нет, зависит от источника и промежуточных операций.
Java 8: coderhelper.com/a/30962181/1216775