如何将Double 转换为double ?

我正在实现一个接口,其function类似于可以包含对象types的表。 该接口指定了以下function:

double[] getDoubles(int columnIndex); 

我被难倒的是,在我的实现中,我将表格数据存储在一个二维Object数组( Object[][] data )中。 当我需要返回值时,我想要做以下操作(假定getDoubles()只会在包含双精度的列上被调用,所以不会有ClassCastExceptions ):

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

但是 – Java不允许将Object[]转换为double[] 。 将它转换为Double[]是可以的,因为Double是一个对象而不是一个原语,但是我的接口指定数据将作为double[]返回。

所以我有两个问题:

  1. 有什么办法可以从列Object[][]表中获取列数据并返回基元数组?
  2. 如果我改变接口来返回Double[] ,会不会有任何性能影响?

不幸的是,如果你想把它转换成double[]你将需要遍历整个列表并取消Double

就性能而言,在Java中装箱和拆箱基元有一段时间。 如果设置足够小,则不会看到任何性能问题。

如果你不介意使用第三方库,commons-lang有ArrayUtilstypes和各种操作方法。

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

也有补充的方法

 doubles = ArrayUtils.toObject(d); 

编辑:回答问题的其余部分。 这样做会有一些开销,但除非数组真的很大,否则不应该担心。 在重构之前先testing它是否是一个问题。

实现你实际问到的方法会给这样的东西。

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

在Java 8中,这是一行:

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

请注意,这仍然遍历原始数组并创build一个新的。

你可以使用一个for循环来构造一个相同大小的临时数组,然后将每个单独的元素转换为double,而将其放入数组中。

所以:

 double[] tempArray = new double[data[columnIndex].length]; int i = 0; for(Double d : (Double) data[columnIndex]) { tempArray[i] = (double) d; i++; } 

如果我在这里死了,请纠正我。

如果你想返回一个double[] ,你需要创build一个new double[] ,填充它,然后返回它。

这可能是一个很好的build筑决策。 首先,将一个Object[] Double[]是没有多大意义的; 它不是真正的Double数组,因为其中也可能有Object 。 其次,如果直接返回数组,用户代码可以修改它,并改变对象的内部结构。

主要的性能影响是返回一个double[]数组,由于拆箱和分配的成本。

除了jjnguy和Eric Koslow所说的,我没有什么可以增加真正的问题的。

但只是一个侧面说明:你提到一个对象数组投掷到一个双数组。 以下将不起作用:

 Object[] oa=new Object[3]; oa[0]=new Double("1.0"); oa[1]=new Double("2.0"); oa[2]=new Double("3.0"); Double[] da=(Double[])oa; 

最后一行会抛出一个类抛出exception。 即使数组中的每个元素确实是Double,该数组也被创build为一个对象数组,而不是一个双精度数组,因此该数组是无效的。

您可以利用ArrayUtils进行转换

 Double[] d; // initialise double[] array = ArrayUtils.toPrimitive(d); 

不需要循环整个数据。

我会第二个ArrayUtils的答案,并补充说,1.5 自动装箱文件 ( 通过 )有点揭示,没有内置的方式:

如果没有允许的转换,而不是从SC到TC的string转换,则不允许从arraystypesSC []到arraystypesTC []的转换