我正在尝试从并行流创建一个大小更大的数组。
myList.parallelStream().map((listElm) -> {
return someObjectMorpher(listElm);}).toArray(size -> new SomeObject[size+4]);发布于 2018-04-10 18:05:42
是否保证数组的最后4个元素始终为空?
从本质上说不是。数组的最后四个元素将保留它们以前的值。如果值恰好是null,那么它们将保持为null。例如:
Integer[] array = Stream.of(7, 8).parallel().toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6});
System.out.println(Arrays.toString(array));输出:
[7, 8, 3, 4, 5, 6]是否有可能让toArray填充已经创建的数组?
是的,见上文,以及另一个例子:
Integer[] array = new Integer[] {1, 2, 3, 4, 5, 6};
Integer[] newArray = Stream.of(7, 8).parallel().toArray(i -> array);
System.out.println(Arrays.toString(newArray));输出:
[7, 8, 3, 4, 5, 6]备注:如果数组的长度与流的大小不同,尝试使用顺序流进行此操作将引发IllegalStateException。
发布于 2018-04-10 18:19:02
更新似乎基于以下问题:Why can I collect a parallel stream to an arbitrarily large array but not a sequential stream?
那
toArray(size -> new Integer[size + 4])生成器--一个函数,它产生一个新的数组,该数组具有所需的类型和给定的长度。
因此,即使下面的断言通过了,下面的代码也不应该使用。
原始响应
是否保证数组的最后4个元素始终为空?这意味着toArray总是在数组的第一个索引处填充。
如果提供生成器函数来分配所需大小的新数组,则此操作确实有效。
Integer[] result = Arrays.asList(3,4,5).parallelStream().map(i -> i + 1).toArray(size -> new Integer[size + 4]);
assert(result.length == 7);
assert(result[3] == null);
assert(result[4] == null);
assert(result[5] == null);
assert(result[6] == null);所有这些断言都过去了。
https://stackoverflow.com/questions/49760006
复制相似问题