Java IntStream итерация против генерации, когда что использовать?

19

Кажется, IntStream.iterateэто просто облегченная заказанная версия для IntStream.generate. Это правда? Если нет, то в чем основная разница?

Джей Джей Бим
источник

Ответы:

21

Обратите внимание, как отличаются их подписи:

  • generateберет IntSupplier, что означает, что вы должны генерировать целые числа, не получая ничего. Примеры использования включают создание постоянного потока с одним и тем же целым числом, создание потока случайных целых чисел. Обратите внимание, что каждый элемент в потоке не зависит от предыдущего элемента.

  • iterateпринимает a seedи a IntUnaryOperator, что означает, что вы должны генерировать каждый элемент на основе предыдущего элемента . Это полезно, например, для создания индуктивно определенной последовательности. В этом случае каждый элемент должен зависеть от предыдущего .

уборщик
источник
Так что использование варианта итерации - когда нужно сохранить состояние - это принципиальное отличие. Генерировать нужно хранить состояние где-то еще. И Итерирование упорядочено, в то время как генерируется неупорядоченное, что является жизнеспособным для паррализма
JJ Beam
8
  1. IntStream.iterateвозвращает заказIntStream с другой стороны, IntStream.generateвозвращает неупорядоченный,IntStream что может помочь в ускорении параллельных потоковых конвейеров.

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

Naman
источник
5

Помимо заказа, использование немного отличается. Давайте посмотрим на метод подписи:

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

Итерация явно дала начальное значение в качестве параметра и унарного оператора, который используется для генерации следующего значения из предыдущего. Здесь оператор может легко быть неизменным без внутреннего состояния и может быть повторно использован в нескольких местах параллельно без каких-либо проблем.

Генерация использует поставщик. Они могут предоставлять либо постоянные, либо случайные числа, либо должны иметь внутреннее состояние для обеспечения ряда, подобного (1, 2, 3, ...).

n1t4chi
источник