代码之家  ›  专栏  ›  技术社区  ›  user3813133

更大尺寸的并行流阵列Java8

  •  3
  • user3813133  · 技术社区  · 8 年前

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

    myList.parallelStream().map((listElm) -> {
                return someObjectMorpher(listElm);}).toArray(size -> new SomeObject[size+4]);
    
    1. 是否保证数组的最后4个元素始终为空? 这意味着toArray将始终在数组的第一个索引处填充。

    2. 是否有可能让阵列填充已创建的阵列

      SomeObjet [] arr = new SomeObject[myList.size() + 4];
      arr[0] = new SomeObject(x);
      myList.parallelStream()
          .map((listElm) -> { return someObjectMorpher(listElm);})
          .toArray(**///use arr** );
      
    2 回复  |  直到 5 年前
        1
  •  3
  •   Jacob G.    8 年前

    是否保证数组的最后4个元素始终为空?

    基本上,不是。数组的最后四个元素将保留其以前的值。如果值恰好为 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]
    

    是否有可能让阵列填充已创建的阵列

    是的,请参见上文以及另一个示例:

    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 如果数组的长度与流的大小不同。

        2
  •  2
  •   Chad K    8 年前

    使现代化 似乎基于这个问题: 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-

    生成器—生成所需类型和提供长度的新数组的函数

    所以即使下面的断言通过了, 不应使用以下代码 。

    原始响应

    是否保证数组的最后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);
    

    所有这些断言都通过了。

    推荐文章