如何将Java 8 Stream转换为二维数组?

12
我正在尝试将基于地图的 Stream 转换为二维数组。我已经想出如何将其存储在一维数组中。以下是可工作的代码片段:

我正在尝试将基于地图的 Stream 转换为二维数组。我已经想出如何将其存储在一维数组中。以下是可工作的代码片段:

Float[] floatArray = map.entrySet()
                        .stream()
                        .map(key -> key.getKey().getPrice())
                        .toArray(size -> new Float[size]);

当我执行上面的代码时,我得到了期望的Float数组。现在我需要将其扩展为一个二维数组,在这样的情况下,我需要将结果存储在一个二维数组的第一维中:


当执行以上代码时,会得到期望的 Float 数组。现在需要将其扩展成一个二维数组,将结果存储在二维数组的第一维中,类似以下这样:
Float[][1] floatArray = map.entrySet()
                           .stream()
                           .map(key -> key.getKey().getPrice())
                           .toArray(size -> new Float[size][1]);

以上代码不起作用。您能告诉我如何使用Java 8流完成此任务吗? 预先感谢!


1
将基于转换和映射的流转换为二维数组。请提供一个这样的映射示例,以及预期输出的二维数组应该是什么样子的。 例如,假设我们有一个基于转换和映射的流,其中包含以下元素:{a:1, b:2, c:3, d:4}。我们可以使用以下代码将其转换为二维数组:const stream = {a:1, b:2, c:3, d:4}; const array = Object.keys(stream).map(key => [key, stream[key]]);这将生成以下二维数组:[ ["a", 1], ["b", 2], ["c", 3], ["d", 4] ] - Nir Alfasi
2个回答

12

如果你看一下 <A> A[] toArray(IntFunction<A[]> generator),你会发现它将一个 Stream<A> 转换为一个由 A 元素组成的 1D 数组 A[]。因此,为了创建一个 2D 数组,Stream 的元素必须是数组。

因此,如果首先将你的 Stream 的元素 map 到一个 1D 数组,然后调用 toArray,就可以创建一个 2D 数组:

Float[][] floatArray = 
    map.entrySet()
       .stream()
       .map(key -> new Float[]{key.getKey().getPrice()})
       .toArray(size -> new Float[size][1]);

非常感谢,这可行!我的下一个问题是,如果我想从地图中填充floatArray的三个维度,例如:Float[][] floatArray = map.entrySet() .stream() .map(key -> new Float[]{key.getKey().getPrice()},{key.getKey().getOpen()},{key.getKey().getClose()}) .toArray(size -> new Float[size][3]); 如何实现? - MazS
我想首先从映射条目中填充2D floatArray的所有三个维度/列,然后在代码中稍后循环遍历floatArray以执行下游计算,例如:for(int i = 0; i <floatArray.rows; i ++){ for(int j = 0; j <floatArray.cols; j ++){ //在此处进行一些计算 someCalc = floatArray [i] [j] * 2; } - MazS
最后一个请求,在floatArray的第三列中,我想存储计数器,例如如果地图中有10个条目,则我想在第三列中存储值1...10。谢谢。 - MazS
我成功地找到了如何填充多个维度的方法:Float[][] floatArray = map.entrySet() .stream() .map(key -> new Float[]{(float) 0.00,key.getKey().getPrice(),(float) 0.00}) .toArray(size -> new Float[size][3]); 唯一剩下的问题是在第一个位置添加计数器,或者如何用计数器替换位置1中的 (float) 0.00。谢谢。 - MazS
@MazS 这仍然是一个二维数组,而不是三维的。如果这是你想要的,你关于“三个维度”的评论有些令人困惑。 - Eran
就像经常发生的一样,原帖作者没有在keySet()entrySet()之间做出正确的选择。如果使用正确的视图,则代码将会更加简单:Float[][] floatArray = map.keySet() .stream() .map(key -> new Float[]{key.getPrice()}) .toArray(Float[][]::new); - Holger

8
您可以使用以下内容:
Float[][] array = map.entrySet()
    .stream()
    .map(Map.Entry::getKey)
    .map(YourKeyClass::getPrice) // 1)
    .map(price -> new Float[]{ price })
    .toArray(Float[][]::new);

这将创建一个二维数组,就像您预期的那样。

注意:在注释1)中,您需要使用包含返回Float对象的getPrice()方法的类替换YourKeyClass


另一种选择是使用.keySet()而不是.entrySet()

Float[][] array = map.keySet().stream()
    .map(YourKeyClass::getPrice)
    .map(price -> new Float[]{price})
    .toArray(Float[][]::new);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接