java 8制作两个倍数的流

Min*_*mut 3 java math java-8 java-stream

我正在java 8中练习流,我试图制作一个Stream<Integer>包含2的倍数.在一个主类中有几个任务所以我不会链接整个块但是到目前为止我得到的是:

Integer twoToTheZeroth = 1;
UnaryOperator<Integer> doubler = (Integer x) -> 2 * x;
Stream<Integer> result = ?;
Run Code Online (Sandbox Code Playgroud)

我的问题可能与流不相关,更像是语法,我应该如何使用doubler来获得结果?

提前致谢!

dan*_*niu 10

你可以用Stream.iterate.

Stream<Integer> result = Stream.iterate(twoToTheZeroth, doubler);
Run Code Online (Sandbox Code Playgroud)

或直接使用lambda

Stream.iterate(1, x -> 2*x);
Run Code Online (Sandbox Code Playgroud)

第一个参数是"种子"(即流的第一个元素),运算符连续应用于每个元素访问.

编辑:

正如Vinay指出的那样,这将导致流最终被填充为0(这是由于int溢出).为了防止这种情况,可以使用BigInteger:

Stream.iterate(BigInteger.ONE, 
               x -> x.multiply(BigInteger.valueOf(2)))
      .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

  • @VinayPrajapati因为整数溢出.你仍然可以获得整数,但是这些将首先变为负数,然后是0,当乘以时将保持为0. (2认同)
  • 或者当`int`范围用尽时停止:`IntStream.range(1,31).map(i - > 1 << i)`顺便说一下,`Stream.iterate(BigInteger.ONE,i - > i. shiftLeft(1))`可能比`Stream.iterate(BigInteger.ONE,x - > x.multiply(BigInteger.valueOf(2)))更有效率`` (2认同)