【问题标题】:How to create an int[] with fixed length and specific number with java stream? [duplicate]如何使用 java 流创建具有固定长度和特定数字的 int[]? [复制]
【发布时间】:2018-10-06 07:40:40
【问题描述】:

我知道如何获得带有一系列数字的int[]

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

但是我怎样才能得到它的固定长度和一个特定的数字呢?

【问题讨论】:

  • 顺便说一句,链接的欺骗中还提供了一个 java-stream 解决方案。

标签: java java-8 java-stream


【解决方案1】:
IntStream.generate(() -> x).limit(y)

是你需要的。将xy 替换为您喜欢的任何数字,您将生成一个包含y 很多数字x 的流。

你显然可以打电话给toArray 或做任何你想做的操作。

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

【讨论】:

  • @Eugene 以什么方式?
  • @Aomine 一个带有limit 的无限流(不引入SIZED 标志)在那个更简单的调用just 上生成一个数组?
  • @Eugene 恕我直言,我什至不会在现阶段对此进行研究,除非另有说明,否则会发现性能瓶颈。这种方法更加紧凑和可读。
  • @Aomine 对你来说可能更具可读性,而不是我。
【解决方案2】:

这是一种方法:

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

应该产生一个长度为n的数组,其中填充了m

下面的问答有其他使用其他方法的答案,例如Arrays.fill方法。

【讨论】:

  • 如果您希望该值成为索引的函数,这很有效。我使用更短的IntStream.range(0, n)。 ;) +1
  • @PeterLawrey or even simpler
【解决方案3】:

或者再简单一点。

// n elements of value m
int[]a=new int[n];
Arrays.fill(a,m);

【讨论】:

  • 这在内部只不过是一个循环......
  • @Eugene 哪个答案不是内部循环?除此之外,如果我必须打赌哪个版本被 JVM 优化得最好,即有机会消除最初的零填充和最快的内存填充操作,我会赌这个。
  • @Holger 我绝对诚实地考虑过这个零填充,甚至认为在这种情况下(或者可能是其他情况),不需要发生这种情况,但是一旦你声明了一个数组,它就会总是预填充零,我不认为 VM 可以消除它,至少我不知道如何证明这一点
  • @Eugene 如this blog 中所述,当数组创建后立即进行覆盖复制操作时,JVM 能够消除归零。我希望随后的fill 操作会立即获得类似的待遇。这里看到的所有其他版本都需要内联其他几个代码,以便能够确定结果是否会真正覆盖整个数组而不读取任何字段并且不能在中间失败。
  • @Holger 漂亮!谢谢!!
【解决方案4】:

使用为此编写的 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);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2019-04-07
  • 2015-06-29
  • 2011-01-29
  • 1970-01-01
  • 2020-04-20
相关资源
最近更新 更多