Java IntStream итерация против генерации, когда что использовать? - PullRequest
19 голосов
/ 14 октября 2019

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

Ответы [ 3 ]

21 голосов
/ 14 октября 2019

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

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

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

8 голосов
/ 14 октября 2019
  1. IntStream.iterate возвращает заказанный IntStream с другой стороны IntStream.generate возвращает неупорядоченный IntStream, который может помочь в ускорении параллельной работыпотоковые конвейеры.

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

5 голосов
/ 14 октября 2019

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

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

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

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

...