【问题标题】:How to access previous value in Stream如何访问 Stream 中的先前值
【发布时间】:2020-08-21 01:42:44
【问题描述】:

考虑以下系列

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;
    }

这个 sn-p 效果很好。但是 java 8 流有迭代函数来创建这样的流。

一般语法是Stream.iterate(0.5,f).limit().forEach(System.out::println);

但是我将如何访问流中的前一个元素?我还需要跟踪 i 的 3 次幂。有人可以帮忙吗?我错过了什么吗?

【问题讨论】:

  • 如果您关心元素的顺序,请参阅 this answer 了解为什么流可能不是最好的抽象。

标签: java java-8 java-stream series


【解决方案1】:

如果我理解正确,您想生成一个流,其中每个元素都是前一个元素乘以 3:

0.5 1.5 4.5 13.5 40.5 121.5

要实现这一点,您不需要像使用传统的 for 循环方法那样跟踪流中的前一个元素。

您可以按照您的建议使用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 不是最大值,而是流中的元素个数。

【讨论】:

  • 我得到了你的想法,但可以按照我之前描述的方式进行吗?
  • @AashishPawar 这确实是您应该根据您的要求生成流的方式。我没有看到任何其他方法可以使用流。
猜你喜欢
  • 2021-09-07
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2012-01-21
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
相关资源
最近更新 更多