【问题标题】:Fill a 3d array with stream in java在java中用流填充3d数组
【发布时间】:2017-06-26 15:52:27
【问题描述】:

我目前的代码是这样的:

double[][][] result = new double[1000][][];
for (int i = 0; i < result.length; i++){
   result[i] = somemethod();
}

现在我想使用流来做同样的事情。我做了很多研究,但找不到用另一种方法的返回值填充第一个维度的答案。

【问题讨论】:

  • 你现在有什么问题?
  • 你的somemethod在做什么?

标签: arrays java-8 java-stream


【解决方案1】:

对于您的任务,阵列的 3D 特性无关紧要。您可以在脑海中将double[][] 替换为X,并遵循与生成数组X[] 时相同的通用步骤:

X[] array = IntStream.range(0, size).mapToObj(i -> somemethod()).toArray(X[]::new);

double[][] 用于X1000 用于size 产生:

double[][][] result
    = IntStream.range(0, 1000).mapToObj(i -> somemethod()).toArray(double[][][]::new);

如果somemethod() 很昂贵,但没有干扰(因此多个并发调用是安全的),您可以将.parallel() 与流一起使用。你也可以使用

double[][][] result = new double[1000][][];
Arrays.parallelSetAll(args, i -> somemethod());

在那种情况下。

【讨论】:

  • parallelSetAll不支持somemethod按顺序返回结果。
  • @holi-java:这里没有排序,除非somemethod 在后台修改共享状态。这就是为什么我说,“如果 somemethod() ... 没有干扰”。否则,你不能同时调用它,所以在修改共享状态时,并行流和parallelSetAll都不能使用。
  • 我的意思是如果somemethod 做类似Iterator 的事情。然后parallelSetAll 将导致无序的结果。我说的对吗?
  • @holi-java:如果它像Iterator 一样工作,它将在检索一个元素时修改Iterator 的状态。这只是“修改共享状态”的一种特殊情况,因此无论您使用流还是parallelSetAll,都不能并行工作。产生有序结果的唯一正确方法是使用 index 参数,OP 的示例代码没有这样做。如果你使用索引,并行流和parallelSetAll 都会做正确的事情。
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 2021-09-27
  • 2011-03-06
  • 2018-10-05
  • 1970-01-01
  • 2018-11-30
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多