使用流在Java 8中使用Double值的Python范围函数

时间:2018-12-01 01:20:27

标签: java java-8

我想在Java中创建一个double数组,其值范围从0到100,步长为0.1

在Python中,可以使用范围函数:range(0, 100, 0.1)

在Java 8中,这将起作用:

Double[] x = DoubleStream.iterate(0.1, i -> i + 0.1).limit(1000).boxed().toArray(Double[]::new);

我可以使用更简单的方法吗?

2 个答案:

答案 0 :(得分:5)

您的解决方案似乎可以使用,但是在进行连续计算时会遇到浮点四舍五入的问题。

  

[0.1,0.2,0.30000000000000004,0.4,0.5,0.6,0.7,0.7999999999999999,0.8999999999999999,0.9999999999999999,1.0999999999999999,

看来DoubleStream没有range方法,但是IntStream does, rangeClosed却没有控制增量。 (也存在range,但结束参数不包含在范围内。)

  

以1的增量步长将IntStream(包括)到startInclusive(包括)的有序endInclusive返回。

您可以通过流传输一些int然后除以10.0来获得0.1的增量来解决累积浮点舍入误差。另外,正如已经提到的,具有原始数组double[]可以避免装箱和额外的内存使用。

double[] y = IntStream.rangeClosed(0, 1000)
    .mapToDouble(i -> i / 10.0)
    .toArray();
  

[0.0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1.0、1.1、1.2、1.3、1.4、1.5、1.6、1.7、1.8、1.9、2.0、2.1、2.2, 2.3、2.4、2.5,

当然总会有一个基本的for循环,对我来说看起来很简单。

double[] z = new double[1001];
for (int i = 0; i < z.length; i++) { z[i] = i / 10.0; }

答案 1 :(得分:0)

当您说“我可以使用更简单的方法吗?”在这种情况下,我认为“简单”意味着“较短”的代码。

使用流API,没有任何东西可以使您的当前代码“更短”。可能解释了为什么Java不是打高尔夫球的顶级代码之一。但是它可以完成工作。

我可能要说的很明显,但是您始终可以做的一件事就是将当前逻辑重构/隐藏到辅助方法range(p1, p2, p3)中,如果您不想这样做,就不必再看一遍并且仅可以调用range(...)

另一方面,@rgettman在“浮点舍入”方面大喊大叫,因此请考虑到这一点。