我正在尝试从并行流创建一个更大尺寸的数组
myList.parallelStream().map((listElm) -> {
return someObjectMorpher(listElm);}).toArray(size -> new SomeObject[size+4]);
SomeObjet [] arr = new SomeObject[myList.size() + 4];
arr[0] = new SomeObject(x);
myList.parallelStream().map((listElm) -> {
return someObjectMorpher(listElm);}).toArray(**///use arr** );
答案 0 :(得分:2)
是否保证数组的最后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]
是否有可能让aAray填充已经创建的数组
是的,见上文,以及另一个例子:
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
。
答案 1 :(得分:1)
<强>更新强> 似乎基于这个问题: Why can I collect a parallel stream to an arbitrarily large array but not a sequential stream?
那
toArray(size -> new Integer[size + 4])
的合同
generator - 一个生成所需类型和提供长度的新数组的函数
所以即使下面的断言通过,也不应该使用下面的代码。
原始回复
是否保证数组的最后4个元素始终为null?这意味着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);
所有这些断言都通过了。