Как получить доступ к предыдущему значению в Stream - PullRequest
0 голосов
/ 06 мая 2020

Рассмотрим следующую серию

0,5 1,5 4,5 13,5 40,5 121,5

Мы можем сгенерировать этот поток, используя традиционные циклы for. например, следующий

    float l = 0.5;
    for(int i=1;i<limit;i++)
    {
       if(i == 1 ) System.out.println(l+" ");
       float n = l+Math.pow(3,i-1);
       System.out.println(n+" ");
       l = n;
    }

Этот фрагмент работает хорошо. но java 8 потоков имеет функции итерации для создания таких потоков.

общий синтаксис: Stream.iterate(0.5,f).limit().forEach(System.out::println);

Но как мне получить доступ к предыдущему элементу в потоках? Также мне нужно отслеживать i для степени 3. Может ли кто-нибудь помочь? Я что-то упустил?

1 Ответ

4 голосов
/ 06 мая 2020

Если я вас правильно понял, вы хотите сгенерировать поток, в котором каждый элемент является предыдущим, умноженным на 3:

0,5 1,5 4,5 13,5 40,5 121,5

To для этого вам не нужно отслеживать предыдущий элемент в потоке, как если бы вы делали это с традиционным для l oop подходом.

Что вы могли бы сделать, так это использовать DoubleStream.iterate() как вы предложили. Метод принимает DoubleUnaryOperator в качестве второго аргумента, который является методом, применяемым при генерации потока. Итак, в вашем случае это будет:

DoubleStream.iterate(0.5, d -> d * 3).limit(6).forEach(System.out::println);

Это дает следующий результат:

0,5 1.5 4.5 13,5 40,5 121,5

limit(6) важно для ограничения количества элементов в потоке, иначе вам придется иметь дело с бесконечностью, из-за чего поток будет потребляться навсегда (или, по крайней мере, до тех пор, пока возникает исключение или возникает ошибка). Не то чтобы аргумент 6 - это не максимальное значение, а количество элементов в потоке.

...