Java IntStream ітерацію проти створення, коли використовувати?


19

Здається, IntStream.iterateце просто легка замовлена ​​версія для IntStream.generate. Це правда? Якщо ні, в чому полягає основна різниця?

Відповіді:


21

Зауважте, чим відрізняються їхні підписи:

  • generatetake a IntSupplier, що означає, що ви повинні генерувати ints, не отримуючи нічого. Приклад звичаїв включає створення постійного потоку одного і того ж цілого числа, створення потоку випадкових цілих чисел. Зауважте, як кожен елемент у потоці не залежить від попереднього елемента.

  • iterateприймає a seedі a IntUnaryOperator, що означає, що ви повинні генерувати кожен елемент на основі попереднього елемента . Це корисно, наприклад, для створення індуктивно визначеної послідовності. У цьому випадку кожен елемент повинен залежати від попереднього .


Тож використовуйте випадок ітерації - коли потрібно зберегти стан - це суть різниці. Створити потребу зберігати стан деінде. Ітерація впорядкована, тоді як генерація не є упорядкованою, що є життєздатним для паралелізму
JJ Beam

8
  1. IntStream.iterateповертає впорядкованийIntStream з іншого боку , IntStream.generateповертає невпорядкованихIntStream , який може допомогти в прискоренні паралельних потоків трубопроводів.

  2. IntStream.generate вважають за краще генерувати випадкові або постійні значення, як зазначено в Javadoc, я б припустив, що найбільш ймовірно для характеристик повернутого потоку.


5

Крім замовлення, також використання дещо інше. Давайте розглянемо метод підписів:

  • iterate(int seed, IntUnaryOperator f)
  • generate(IntSupplier s)

Ітерація явно вказала початкове значення в якості параметра і одинарного оператора, який використовується для генерування наступного значення від попереднього. Тут оператор може бути легко незмінним без внутрішнього стану і може бути повторно використаний у декількох місцях паралельно без жодних проблем.

Генератор використовує постачальника. Вони можуть або надавати постійні, або випадкові числа, або потрібно мати внутрішній стан, щоб надати такі серії, як (1, 2, 3, ...).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.