Здається, IntStream.iterateце просто легка замовлена версія для IntStream.generate. Це правда? Якщо ні, в чому полягає основна різниця?
Здається, IntStream.iterateце просто легка замовлена версія для IntStream.generate. Це правда? Якщо ні, в чому полягає основна різниця?
Відповіді:
Зауважте, чим відрізняються їхні підписи:
generatetake a IntSupplier, що означає, що ви повинні генерувати ints, не отримуючи нічого. Приклад звичаїв включає створення постійного потоку одного і того ж цілого числа, створення потоку випадкових цілих чисел. Зауважте, як кожен елемент у потоці не залежить від попереднього елемента.
iterateприймає a seedі a IntUnaryOperator, що означає, що ви повинні генерувати кожен елемент на основі попереднього елемента . Це корисно, наприклад, для створення індуктивно визначеної послідовності. У цьому випадку кожен елемент повинен залежати від попереднього .
IntStream.iterateповертає впорядкованийIntStream з іншого боку , IntStream.generateповертає невпорядкованихIntStream , який може допомогти в прискоренні паралельних потоків трубопроводів.
IntStream.generate вважають за краще генерувати випадкові або постійні значення, як зазначено в Javadoc, я б припустив, що найбільш ймовірно для характеристик повернутого потоку.
Крім замовлення, також використання дещо інше. Давайте розглянемо метод підписів:
iterate(int seed, IntUnaryOperator f)generate(IntSupplier s)Ітерація явно вказала початкове значення в якості параметра і одинарного оператора, який використовується для генерування наступного значення від попереднього. Тут оператор може бути легко незмінним без внутрішнього стану і може бути повторно використаний у декількох місцях паралельно без жодних проблем.
Генератор використовує постачальника. Вони можуть або надавати постійні, або випадкові числа, або потрібно мати внутрішній стан, щоб надати такі серії, як (1, 2, 3, ...).