我正在尝试将基于Stream
的地图转换为二维数组。我已经想出如何将它存储在一维数组中。这是工作代码片段:
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流完成这项任务吗?提前谢谢!
答案 0 :(得分:5)
如果您查看<A> A[] toArray(IntFunction<A[]> generator)
,就会发现它将Stream<A>
转换为A[]
,这是一个A
元素的一维数组。因此,为了创建2D数组,Stream
的元素必须是数组。
因此,如果您首先map
Stream
到1D数组的元素然后调用toArray
,则可以创建2D数组:
Float[][] floatArray =
map.entrySet()
.stream()
.map(key -> new Float[]{key.getKey().getPrice()})
.toArray(size -> new Float[size][1]);
答案 1 :(得分:3)
您可以使用以下内容:
Float[][] array = map.entrySet()
.stream()
.map(Map.Entry::getKey)
.map(YourKeyClass::getPrice) // 1)
.map(price -> new Float[]{ price })
.toArray(Float[][]::new);
这就像你期望的那样创建一个2D数组。
注意:通过评论 1),您必须将YourKeyClass
替换为包含方法getPrice()
的类。
另一种方法是使用.keySet()
代替.entrySet()
:
Float[][] array = map.keySet().stream()
.map(YourKeyClass::getPrice)
.map(price -> new Float{price})
.toArray(Float[][]::new);