[英]How to generate a 2D int array using Java 8 stream?
我正在尝试使用Java 8流生成int[][]
。
这是我到目前为止所做的:
objects.parallelStream()
.map(o -> o.getPropertyOnes()
.parallelStream()
.map(t-> t.getIndex()) //<-- getIndex() returns int
.mapToInt(i -> i)
.toArray()) //<-- here I have a Stream<int[]>
.toArray(); //lost here
在外部.map()
的末尾,我有一个Stream<int[]>
,但不知道如何将其转换为int[][]
。 请建议。
首先,您可以将map().mapToInt()
简化为mapToInt(t-> t.getIndex())
(也许您应该使用类似<type>::getIndex
的方法引用)。
如你所说,你在map
阶段后有Stream<int[]>
。 那么你只需要提供一个数组生成器函数,如:
int[][] array = Stream.of(1, 2, 3, 4)
.map(i -> IntStream.range(0, i).toArray())
.toArray(int[][]::new);
输出:
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]
你需要一个toArray(generator)
方法来帮助我们通过IntFunction<T[]>
函数指定一个返回类型:
int[][] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray(int[][]::new);
而不是toArray()
,它返回Object[]
而不管Stream
中的传入类型(在内部调用toArray(Object[]::new)
):
Object[] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray();
如果您对幕后感兴趣,所有这些都具有以下外观:
Node
[在我们的例子中是一个ArrayNode
](一个用于保持有序元素序列的不可变容器)来自前一阶段的Pipeline
; node.count()
); IntFunction<T[]>
生成器获取一个具有所需长度的新空数组( i -> new int[i][]
或简单地int[][]::new
); 如果要生成序列号为n X n的二维数组,其中n为度。
int n = 4;
System.out.println(Arrays.deepToString(IntStream.rangeClosed(0, n - 1)
.boxed().map(x -> IntStream.rangeClosed(x * n + 1, (x + 1) * n)
.boxed().toArray()).toArray()));
Output: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.