I am trying to create an array with higher size from a parallel stream
myList.parallelStream().map((listElm) -> {
return someObjectMorpher(listElm);}).toArray(size -> new SomeObject[size+4]);
Is it guaranteed that the last 4 elements of the array will always be null? Which means toArray will always populate at first indices of the Array.
Is there a possibility of having toArray populate an already created array
SomeObjet [] arr = new SomeObject[myList.size() + 4]; arr[0] = new SomeObject(x); myList.parallelStream() .map((listElm) -> { return someObjectMorpher(listElm);}) .toArray(**///use arr** );
Is it guaranteed that the last 4 elements of the array will always be null?
Essentially, no. The last four elements of the array will retain their previous value. If the value happened to be null
, then they will remain null
. For example:
Integer[] array = Stream.of(7, 8).parallel().toArray(i -> new Integer[] {1, 2, 3, 4, 5, 6});
System.out.println(Arrays.toString(array));
Output:
[7, 8, 3, 4, 5, 6]
Is there a possibility of having toArray populate an already created array
Yes, see above, as well as another example:
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));
Output:
[7, 8, 3, 4, 5, 6]
Note : Attempting this with sequential streams will throw an IllegalStateException
if the length of the array differs from the size of the stream.
Update It seems based on this question: Why can I collect a parallel stream to an arbitrarily large array but not a sequential stream?
That
toArray(size -> new Integer[size + 4])
Is breaking the contract of the generator https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#toArray-java.util.function.IntFunction-
generator - a function which produces a new array of the desired type and the provided length
So even though the assertions below pass, the code below should not be used .
Original response
Is it guaranteed that the last 4 elements of the array will always be null? Which means toArray will always populate at first indices of the Array.
This does work if you provide a generator function to allocate a new array of your desired size.
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);
All of these assertions pass.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.