如何将双精度[]转换为双精度[]?

2022-08-31 14:05:19

我正在实现一个接口,该接口具有类似于可以包含一类对象的表的功能。接口指定以下函数:

double[] getDoubles(int columnIndex);

我遇到困难的地方是,在我的实现中,我将表数据存储在2D数组中()。当我需要返回值时,我想执行以下操作(假设只会在包含双精度值的列上调用,因此不会有):ObjectObject[][] datagetDoubles()ClassCastExceptions

double[] getDoubles(int columnIndex) {
    return (double[]) data[columnIndex];
}

但是 - Java 不允许被强制转换为 。将其强制转换为是可以的,因为它是一个对象而不是基元,但我的接口指定数据将作为 .Object[]double[]Double[]Doubledouble[]

所以我有两个问题:

  1. 有没有办法将列数据从表中取出并返回基元数组?Object[][]
  2. 如果我确实更改了返回的接口,会不会对性能产生任何影响?Double[]

答案 1

如果你不介意使用第三方库,commons-lang具有ArrayUtils类型,具有各种操作方法。

Double[] doubles;
...
double[] d = ArrayUtils.toPrimitive(doubles);

还有补充方法

doubles = ArrayUtils.toObject(d);

编辑:回答问题的其余部分。这样做会有一些开销,但除非数组真的很大,否则你不应该担心它。在重构之前,请先对其进行测试以查看它是否是问题。

实现您实际询问的方法将给出类似这样的东西。

double[] getDoubles(int columnIndex) {
    return ArrayUtils.toPrimitive(data[columnIndex]);
}

答案 2

在 Java 8 中,这是单行代码:

Double[] boxed = new Double[] { 1.0, 2.0, 3.0 };
double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray();

请注意,这仍会循环访问原始数组并创建一个新数组。