Java IntStream iteruje vs generuje, kiedy z czego korzystać?


19

Wygląda na IntStream.iterateto, że jest to tylko lekka, zamówiona wersja IntStream.generate. Czy to prawda? Jeśli nie, jaka jest podstawowa różnica?

Odpowiedzi:


21

Zwróć uwagę, jak różnią się ich podpisy:

  • generatebierze 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.

  • iterateprzyjmuje a seedi 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 .


Więc użyj przypadku iteracji - kiedy trzeba zapisać stan - to jest podstawowa różnica. Generuj potrzebę przechowywania stanu w innym miejscu. I iteracja jest uporządkowana, podczas gdy generowanie jest nieuporządkowane, co jest opłacalne dla parralelizmu
JJ Beam

8
  1. IntStream.iteratezwraca uporządkowane,IntStream z drugiej strony IntStream.generatezwraca nieuporządkowane,IntStream co może pomóc w przyspieszeniu potoków równoległego strumienia.

  2. 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.


5

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, ...).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.