Odpowiedzi:
Zwróć uwagę, jak różnią się ich podpisy:
generate
bierze a IntSupplier
, co oznacza, że powinieneś generować ints bez niczego. Przykładowe zastosowania obejmują tworzenie stałego strumienia tej samej liczby całkowitej, tworzenie strumienia losowych liczb całkowitych. Zauważ, że każdy element w strumieniu nie zależy od poprzedniego elementu.
iterate
przyjmuje a seed
i a IntUnaryOperator
, co oznacza, że należy wygenerować każdy element na podstawie poprzedniego elementu . Jest to przydatne na przykład do utworzenia sekwencji zdefiniowanej indukcyjnie. W takim przypadku każdy element powinien zależeć od poprzedniego .
IntStream.iterate
zwraca uporządkowane,IntStream
z drugiej strony IntStream.generate
zwraca nieuporządkowane,IntStream
co może pomóc w przyspieszeniu potoków równoległego strumienia.
IntStream.generate
są preferowane do generowania losowych lub stałych wartości, jak określono w Javadoc, domyślam się, że najbardziej prawdopodobne są cechy zwróconego strumienia.
Oprócz zamówienia, również użycie jest nieco inne. Spójrzmy na podpisy metod:
iterate(int seed, IntUnaryOperator f)
generate(IntSupplier s)
Iterate wyraźnie podało wartość początkową jako parametr i jednoargumentowy operator, który służy do generowania następnej wartości z poprzedniej. Tutaj operator może łatwo zostać niezmienny bez stanu wewnętrznego i może być ponownie używany w wielu miejscach równolegle bez żadnych problemów.
Generuj wykorzystuje dostawcę. Mogą one zapewniać stałe lub losowe liczby lub muszą mieć stan wewnętrzny, aby zapewnić szereg taki jak (1, 2, 3, ...).