ParallelStream toArray更大的Java8

时间:2018-04-10 17:46:56

标签: java java-8 java-stream

我正在尝试从并行流创建一个更大尺寸的数组

myList.parallelStream().map((listElm) -> {
            return someObjectMorpher(listElm);}).toArray(size -> new SomeObject[size+4]);
  1. 是否保证数组的最后4个元素始终为null? 这意味着toArray将始终填充数组的第一个索引。
  2. 是否有可能让aAray填充已经创建的数组
  3. SomeObjet [] arr = new SomeObject[myList.size() + 4]; arr[0] = new SomeObject(x); myList.parallelStream().map((listElm) -> { return someObjectMorpher(listElm);}).toArray(**///use arr** );

2 个答案:

答案 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])

违反了生成器https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#toArray-java.util.function.IntFunction-

的合同
  

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);

所有这些断言都通过了。