首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8LAMBDA将Number[][]转换为double[][]

Java8LAMBDA将Number[][]转换为double[][]
EN

Stack Overflow用户
提问于 2015-03-20 22:47:19
回答 2查看 5.6K关注 0票数 8
代码语言:javascript
复制
Number[][] intArray = new Integer[][]{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
double[][] doubleArray = Arrays.stream(intArray)
                            .forEach(pArray -> Arrays.stream(pArray)
                                                .mapToDouble(d ->d.doubleValue())
                                                .toArray())
                            .toArray();

我想把一个数字转换成双倍。上面的lambda不工作,外部toArray不编译。

Arrays.stream(intArray):返回Integer[]流

forEach :对于每个Integer[],创建一个整数流,将每个整数转换为double,并返回一个double[]。

for创建double[],我认为外部toArray将返回此double[]的数组

我怎么才能让这个起作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-20 22:56:17

以下是你如何做到的:

代码语言:javascript
复制
double[][] doubleArray = Arrays.stream(intArray)
                               .map(arr -> Stream.of(arr).mapToDouble(Number::doubleValue).toArray())
                               .toArray(double[][]::new);

这可以分解如下:

首先,使用Arrays.stream创建一个Stream<Number[]>。然后,为每个Number[]创建一个Stream<Number>,并使用mapToDouble获取DoubleStream,然后使用toArray()获取double[]数组。

最后的toArray调用将此Stream<double[]>转换为double[][]数组。

票数 12
EN

Stack Overflow用户

发布于 2015-03-20 22:58:03

首先,forEach是具有返回类型的void的终端操作符,因此不能使用

代码语言:javascript
复制
stream().forEach(...).toArray();
//                   ^void returned here, and void doesn't have `toArray` method

您需要将数据mapdouble[]行中,然后将它们收集到double[][]中,这就引出了第二个问题,因为toArray() (从对象流)返回不能存储在double[][]引用中的Object[]数组。你需要用

代码语言:javascript
复制
A[] toArray(IntFunction<A[]> generator)

,这将返回正确的数据类型,因此可以使用

代码语言:javascript
复制
toArray(size -> new double[size][])

或者更短的版本

代码语言:javascript
复制
toArray(double[][]::new)

下面是代码的外观:

代码语言:javascript
复制
double[][] doubleArray = Arrays.stream(intArray)
        .map(
                pArray -> Arrays
                .stream(pArray)
                .mapToDouble(d -> d.doubleValue())
                .toArray()
        ).toArray(double[][]::new);
        //which is equivalent of
//      ).toArray(size -> new double[size][]);

//---[Test]---
for (double[] row : doubleArray){
    System.out.println(Arrays.toString(row));
}

输出:

代码语言:javascript
复制
[1.0, 2.0, 3.0]
[4.0, 5.0, 6.0]
[7.0, 8.0, 9.0]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29176959

复制
相关文章

相似问题

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