首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java-8流将n维数组映射到另一种类型?

如何使用Java-8流将n维数组映射到另一种类型?
EN

Stack Overflow用户
提问于 2016-02-03 20:04:09
回答 1查看 641关注 0票数 1

我有一个double[][],我想把它转换成BigDecimal[][]。我可以做以下几件事:

代码语言:javascript
复制
public static BigDecimal[][] convert(double[][] arr1){
    BigDecimal[][] arr2 = new BigDecimal[arr1.length][arr1[0].length];
    for(int i = 0; i < arr1.length; i++){
        for(int j = 0; j < arr1[0].length; j++){
            arr2[i][j] = new BigDecimal(arr1[i][j]);
        }
    }
    return arr2;
}

如何使用Java-8中的流执行此操作?

通常,如果一个类型为Foo的对象具有一个构造函数,该构造函数接受一个类型为Bar的对象,那么使用流将Bar[][]转换为Foo[][]的最佳方法是什么?从Bar[][][]Foo[][][]怎么样?

单维度的转换是直进的.我用于一维数组的代码是:

代码语言:javascript
复制
pubilc static Foo[] convert(Bar[] bars){
    return Arrays.stream(bars).mapToObj(Foo::new).toArray(Foo[]::new); 
}

如何在二维内实现这一点?三维空间或者四维空间呢?是否可以编写递归方法将一种类型的n-dimensional数组转换为另一种类型的n-dimensional数组?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-03 20:12:21

直截了当方式:

代码语言:javascript
复制
public static BigDecimal[][] convert(double[][] arr1){
    return Arrays.stream(arr1).map(
        r -> Arrays.stream(r).mapToObj(BigDecimal::new).toArray(BigDecimal[]::new)
    ).toArray(BigDecimal[][]::new);
}

这将从输入数组创建一个Stream<double[]>,将每个double[]映射到一个BigDecimal[] (通过创建一个DoubleStream并将每个double映射到一个新的BigDecimal),并最终生成该流的BigDecimal[][]数组。

将其扩展到3D数组是相同的逻辑:我们对输入数组创建一个Stream<double[][]>,通过前面的代码将每个double[][]转换为BigDecimal[][],并将其转换回一个数组。

代码语言:javascript
复制
public static BigDecimal[][][] convert(double[][][] arr1){
    return Arrays.stream(arr1).map(r -> convert(r)).toArray(BigDecimal[][][]::new);
}

多亏了Holger,它纠正了我最初的方法,可以通过以下方式将其扩展到n维度数组。限制是您需要对基元数组进行特殊处理。

代码语言:javascript
复制
public static <T> T[] convert(
    Object[] array, Function<Object, Object> mapper, Class<T[]> returnClass) {

    Class componentType = returnClass.getComponentType();
    return Arrays.stream(array)
                 .map(array instanceof Object[][]?
                      r -> convert((Object[])r, mapper, componentType): mapper::apply)
                 .toArray(i -> returnClass.cast(Array.newInstance(componentType, i)));
}

(注意,您可能需要明确地导入java.lang.reflect.Array )。测试用

代码语言:javascript
复制
public static void main(String[] args) {
    Double[][] d = { { 0.1 }, { }, { 0.2, 0.3 } };
    BigDecimal[][] bd=convert(d, v -> new BigDecimal((Double) v), BigDecimal[][].class);
    System.out.println(Arrays.deepToString(bd));
}

当将它与基元数组一起使用时,您必须使用mapper函数处理最后一个维度(例如double[]),因为一维基元数组不是Object[]的实例,不能用泛型代码处理。一个示例用法是

代码语言:javascript
复制
public static void main(String[] args) {
    double[][][] da= { {{ 0.1 }, { }}, {{ 0.2, 0.3 }, { 0.4 }} };
    BigDecimal[][][] bd=convert(da,
      v -> Arrays.stream((double[])v).mapToObj(BigDecimal::new).toArray(BigDecimal[]::new),
      BigDecimal[][][].class);
    System.out.println(Arrays.deepToString(bd));
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35186603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档