Wygląda na IntStream.iterate
to, że jest to tylko lekka, zamówiona wersja IntStream.generate
. Czy to prawda? Jeśli nie, jaka jest podstawowa różnica?
źródło
Wygląda na IntStream.iterate
to, że jest to tylko lekka, zamówiona wersja IntStream.generate
. Czy to prawda? Jeśli nie, jaka jest podstawowa różnica?
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 stronyIntStream.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.źródło
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, ...).
źródło