我正在尝试使用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[][]
。请建议。
答案 0 :(得分:6)
首先,您可以将map().mapToInt()
简化为mapToInt(t-> t.getIndex())
(也许您应该使用<type>::getIndex
之类的方法参考。
如你所说,Stream<int[]>
阶段之后你有map
。然后你只需要提供一个数组生成器函数,如:
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]]
答案 1 :(得分:3)
您需要toArray(generator)
方法帮助我们通过 List<Dictionary> dictList = dictService.findAllDictionaries();
model.addAttribute("dictionary", new Dictionary());
model.addAttribute("dictList", dictList);
Neither BindingResult nor plain target object for bean name 'dict' available as request attribute
函数指定返回类型:
IntFunction<T[]>
而不是toArray()
,它返回int[][] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray(int[][]::new);
而不管Object[]
中的传入类型(在内部调用Stream
):
toArray(Object[]::new)
如果您对幕后感兴趣,所有这些都具有以下外观:
Object[] a = Stream.of(new int[]{1, 2, 3}, new int[]{4, 5, 6}).toArray();
[an Node
(用于保持有序元素序列的不可变容器)来自前一阶段的ArrayNode
; Pipeline
); node.count()
生成器(IntFunction<T[]>
或简称i -> new int[i][]
)获取所需长度的新空数组; 答案 2 :(得分:0)
如果要生成n个n个连续数字的2D数组,其中度数为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]]