Кажется, IntStream.iterate
это просто облегченная заказанная версия для IntStream.generate
. Это правда? Если нет, то в чем основная разница?
Кажется, IntStream.iterate
это просто облегченная заказанная версия для IntStream.generate
. Это правда? Если нет, то в чем основная разница?
Ответы:
Обратите внимание, как отличаются их подписи:
generate
берет IntSupplier
, что означает, что вы должны генерировать целые числа, не получая ничего. Примеры использования включают создание постоянного потока с одним и тем же целым числом, создание потока случайных целых чисел. Обратите внимание, что каждый элемент в потоке не зависит от предыдущего элемента.
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, ...).