【问题标题】:How to convert a Java 8 Stream into a two dimensional array?如何将 Java 8 Stream 转换为二维数组?
【发布时间】:2018-05-03 23:51:30
【问题描述】:

我正在尝试将基于 Stream 的地图转换为二维数组。我已经想出了如何将它存储在一维数组中。这是工作代码sn-p:

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

当我执行上述代码时,我的Float 数组按预期填充。现在我需要将它扩展到一个二维数组,我需要将结果存储在二维数组的第一维中:

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

上面的代码不起作用。您能否让我知道如何使用 Java 8 流完成此任务?提前致谢!

【问题讨论】:

  • “将基于映射的流转换为二维数组” - 请发布此类映射的(小)示例以及二维数组的外观(预期输出)。

标签: java multidimensional-array lambda java-8 java-stream


【解决方案1】:

如果您查看<A> A[] toArray(IntFunction<A[]> generator),您会看到它将Stream<A> 转换为A[],这是A 元素的一维数组。所以为了让它创建一个二维数组,Stream 的元素必须是数组。

因此,如果您首先将map 的元素Stream 转换为一维数组,然后调用toArray,则可以创建二维数组:

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]);这如何实现?
  • 我希望能够首先从地图条目中填充我的 2D floatArray 的所有三个维度/列,然后稍后在代码中循环通过 floatArray 以使用 floatArray 执行下游计算,如下所示: for (int i=0; i
  • 最后一个请求,在 floatArray 的第三列中,我想存储计数器,例如,如果地图中有 10 个条目,我想在第三列中存储值 1...10。谢谢
  • 我能够弄清楚如何填充多个维度: 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 中的(浮动)0.00。谢谢
  • @MazS 仍然是 2D 数组,而不是 3D。如果这就是您想要的,那么您对“三个维度”的评论令人困惑。
【解决方案2】:

您可以使用以下内容:

Float[][] array = map.entrySet()
    .stream()
    .map(Map.Entry::getKey)
    .map(YourKeyClass::getPrice) // 1)
    .map(price -> new Float[]{ price })
    .toArray(Float[][]::new);

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

注意:通过注释1),您必须将 YourKeyClass 替换为包含方法 getPrice() 的类,该方法返回一个 Float 对象。


另一种方法是使用.keySet() 代替.entrySet()

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

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2019-12-06
    • 2011-07-05
    • 2019-07-09
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多