返回

如何从二维对象数组中获取原始类型数组?

java

从二维对象数组获取原始类型数组

在 Java 中,当我们需要操作一个数据表时,可能会遇到一个问题:如何从一个二维对象数组中获取列数据并返回原始类型数组。对于这个问题,有两个主要挑战:

1. 性能影响: 将接口更改为返回 Double[] 可能会对性能产生轻微影响。原始类型数组(如 double[])比对象数组(如 Double[])更紧凑、占用内存更少。此外,原始类型数组上的操作通常比对象数组上的操作更快。

2. 类型转换: Java 不允许将 Object[] 直接转换为 double[]。可以将其转换为 Double[],但接口规定将数据返回为 double[]

解决方法

有几种方法可以解决这个问题:

1. 使用流和映射:

可以使用流和映射对二维数组中的每一行进行操作,并将其转换为 double

double[] getDoubles(int columnIndex) {
    return Arrays.stream(data)
            .mapToDouble(row -> (Double) row[columnIndex])
            .toArray();
}

2. 使用循环和装箱:

可以使用循环和装箱将 Object[][] 数据表中的每一行转换为 double

double[] getDoubles(int columnIndex) {
    double[] doubles = new double[data.length];
    for (int i = 0; i < data.length; i++) {
        doubles[i] = (Double) data[i][columnIndex];
    }
    return doubles;
}

3. 使用 Arrays.stream()asDoubleStream()

可以使用 Arrays.stream()asDoubleStream()Object[][] 数据表中的每一行转换为 double

double[] getDoubles(int columnIndex) {
    return Arrays.stream(data)
            .flatMapToDouble(Arrays::stream)
            .asDoubleStream()
            .toArray();
}

结论

从二维对象数组中获取原始类型数组的最佳方法将取决于应用程序的特定要求。一般来说,使用流和映射的方法在性能和可读性方面都更优。但是,如果性能至关重要,则使用循环和装箱或 Arrays.stream()asDoubleStream() 的方法可能更合适。

常见问题解答

1. 这种转换会对内存使用产生什么影响?

原始类型数组比对象数组占用更少的内存,因为它们不存储对象引用。

2. 这些转换方法的性能如何比较?

使用流和映射的方法在性能和可读性方面都更好。但是,如果性能至关重要,则使用循环和装箱或 Arrays.stream()asDoubleStream() 的方法可能更合适。

3. 我可以将这些方法用于其他原始类型数组吗?

这些方法可以用于将二维对象数组转换为任何原始类型数组。只需更改 mapToDouble()asDoubleStream() 调用中的目标类型即可。

4. 如果我的数据包含空值怎么办?

这些方法会将空值转换为 0.0。如果需要处理空值,则需要编写自定的代码。

5. 是否有用于这些转换的库?

有许多库可以帮助进行这些转换。例如,Apache Commons Lang 提供 ArrayUtils 类,其中包含 toObjectArray()toDoubleArray() 等方法。