我想知道什么时候可以有效地使用 IntStream.range
。我有三个原因不确定 IntStream.range
有多有用。
(请将开始和结束视为整数。)
- 如果我想要一个数组
[start, start+1, ..., end-2, end-1]
,下面的代码要快得多。
int[] arr = new int[end - start];
int index = 0;
for(int i = start; i < end; i++)
arr[index++] = i;
这可能是因为 toArray()
在 IntStream.range(start, end).toArray()
中非常慢。
我使用 MersenneTwister 来打乱数组。 (我在线下载了 MersenneTwister 课程。)我认为没有办法使用 MersenneTwister 洗牌
IntStream
。我不认为仅仅获得
int
数字从start
到end-1
是有用的。我可以使用for(int i = start; i < end; i++)
,这看起来更容易而且不慢。
你能告诉我什么时候应该选择 IntStream.range
吗?
原文由 user5790923 发布,翻译遵循 CC BY-SA 4.0 许可协议
IntStream.range
有多种用途。一种是使用
int
值本身:另一种是做某事N次:
您的情况 (1) 是创建一个填充范围的数组:
您说这“非常慢”,但与其他受访者一样,我怀疑您的基准方法。对于小型阵列,流设置确实有更多的开销,但这应该小到不明显。对于大型阵列,开销应该可以忽略不计,因为填充大型阵列主要由内存带宽决定。
有时您需要填充现有数组。你可以这样做:
有一个实用方法
Arrays.setAll
可以更简洁地做到这一点:还有
Arrays.parallelSetAll
可以并行填充现有数组。在内部,它只是使用IntStream
并在其上调用parallel()
。这应该为多核系统上的大型阵列提供加速。我发现我在 Stack Overflow 上的很多回答都涉及使用
IntStream.range
。您可以在搜索框中使用以下搜索条件搜索它们:IntStream.range
我发现特别有用的一个应用是对数组的元素进行操作,其中数组索引以及数组的值参与计算。有一整类这样的问题。例如,假设您要查找数组中递增数字游程的位置。结果是第一个数组中的索引数组,其中每个索引都指向运行的开始。
要计算此值,请观察运行从值小于先前值的位置开始。 (运行也从位置 0 开始)。因此:
当然,您可以使用 for 循环执行此操作,但我发现在许多情况下使用
IntStream
更可取。例如,使用toArray()
很容易将未知数量的结果存储到数组中,而对于 for 循环,您必须处理复制和调整大小,这会分散循环的核心逻辑。最后,并行运行
IntStream.range
计算要容易得多。