Chociaż jest forEach
krótszy i wygląda ładniej, sugerowałbym użycie go forEachOrdered
w każdym miejscu, w którym ma znaczenie, aby wyraźnie to określić. W przypadku strumieni sekwencyjnych forEach
wydaje się, że szanuje kolejność, a nawet wykorzystuje wewnętrzny kod API strumienia forEach
(dla strumienia, o którym wiadomo, że jest sekwencyjny), gdzie jest to semantycznie konieczne forEachOrdered
! Niemniej jednak możesz później zdecydować się na zmianę strumienia na równoległy, a kod zostanie uszkodzony. Również podczas korzystania forEachOrdered
z czytnika Twojego kodu zobaczysz komunikat: „tu liczy się kolejność”. W ten sposób lepiej dokumentuje twój kod.
Należy również zauważyć, że dla strumieni równoległych forEach
nie tylko jest wykonywany w kolejności niedetenistycznej, ale można go również wykonywać jednocześnie w różnych wątkach dla różnych elementów (co nie jest możliwe w przypadku forEachOrdered
).
Wreszcie oba forEach
/ forEachOrdered
są rzadko przydatne. W większości przypadków faktycznie potrzebujesz jakiegoś wyniku, a nie tylko efektu ubocznego, dlatego operacje takie jak reduce
lub collect
powinny być bardziej odpowiednie. Wyrażanie operacji redukcji z natury za pomocą forEach
jest zwykle uważane za zły styl.