Кажется, 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, ...).