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, я бы, скорее всего, предположил характеристики возвращаемого потока.


5

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.