如何将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[]
返回。
所以我有两个问题:
- 有什么办法可以从列
Object[][]
表中获取列数据并返回基元数组? - 如果我改变接口来返回
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 []的转换