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