Потоки
До 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
не гарантує, що порядок буде дотримано.
Також при роботі з потоками (особливо паралельними) пам’ятайте про природу потоків. Відповідно до документа :
Результати потокового конвеєра можуть бути недетермінованими або неправильними, якщо параметри поведінки для операцій потоку є стаціонарними. Влучна лямбда - результат, результат якого залежить від стану, який може змінитися під час виконання потокового конвеєра.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
Тут, якщо операція з картографуванням виконується паралельно, результати одного і того ж вводу можуть змінюватись від запуску до запуску через різниці в плануванні потоку, тоді як, за виразом лямбда без стану, результати завжди будуть однаковими.
Побічні ефекти в поведінкових параметрах для потокових операцій, як правило, не відштовхуються, оскільки вони часто можуть призвести до ненавмисних порушень вимоги без громадянства, а також до інших небезпек для безпеки потоку.
Потоки можуть мати або не мати певного порядку зустрічі. Чи має потік порядок зустрічей чи ні, залежить від джерела та проміжних операцій.