如何使用Java Stream创建固定长度和特定数字的int[]数组?

4

我知道如何获取一个具有数字范围的int[]

int[] array = IntStream.of(0, 3).toArray();

但是如何获取一个固定长度和一个特定数字的值呢?

顺便提一下,链接的重复问题中也提供了Java Stream解决方案。 - Ousmane D.
4个回答

7
IntStream.generate(() -> x).limit(y)

这是你需要的。将xy替换为任何您喜欢的数字,您将生成一个具有y个数字x的流。

然后您可以明显地调用toArray或执行您想要的任何操作。

IntStream.generate使用供应商创建一个无限流。


@Eugene 以什么方式? - Ousmane D.
@Aomine 一个无限流带有limit(不引入SIZED标志)的简单调用,仅用于生成数组? - Eugene
@Eugene 在我看来,除非发现性能瓶颈,否则在这个阶段甚至不必考虑那个。这种方法更加简洁易读。 - Ousmane D.
@Aomine 不仅是一个解决方案,而且我们在这里意见不一致,实际上是一件好事 ;) - Eugene
显示剩余2条评论

3

以下是一种方法:

int[] array = IntStream.rangeClosed(1, n).map(x -> m).toArray();

这应该产生长度为n,填充有m的数组。

以下问答中还有其他使用不同方法的答案,比如使用Arrays.fill方法。


如果您希望该值是索引的函数,则此方法非常有效。我使用IntStream.range(0, n),这更短。;) +1 - Peter Lawrey
@PeterLawrey 或者更简单一些 - Eugene

3
或者更简单一些。
// n elements of value m
int[]a=new int[n];
Arrays.fill(a,m);

1
其内部实际上就是一个循环... - Eugene
@Eugene,哪个答案不是内部循环?除此之外,如果我必须打赌哪个版本最能被JVM优化,即有机会消除初始零填充和最快的内存填充操作,我会押注这个版本。 - Holger
@Holger 我非常真诚地考虑过这个零填充,甚至认为在这种情况下(或者可能还有其他情况),不需要发生这种情况,但是一旦你声明了一个数组,它将始终被预先填充为零,我不认为虚拟机可以消除这种情况,至少我不知道如何证明。 - Eugene
2
根据@Eugene在这篇博客中所述,当数组创建紧随其后的是一次重写复制操作时,JVM能够消除零化。我期望立即随后的fill操作也能得到类似的处理。这里看到的所有其他版本都需要内联若干其他代码,才能确定结果是否真正覆盖整个数组而不读取任何字段,并且不能在中途失败。 - Holger
@Holger 美丽!谢谢!! - Eugene

2

甚至可以使用为此编写的API更简单:

int[] arr = new int[10];
Arrays.setAll(arr, x -> 1);

// or if you have enough data for parallel to make any difference
Arrays.parallelSetAll(arr, x -> 1);

甚至可以使用 https://dev59.com/Rq7la4cB1Zd3GeqPk-iG#52677996。 - Peter Lawrey
@PeterLawrey 我只是想为此进行编辑,但我想现在已经太晚了。 - Eugene
1
如果你不想让所有元素都相同,那么你的方法更好。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接