这个for循环可以转换为IntStream吗?

时间:2018-04-09 09:08:05

标签: java java-8

是否有任何方法可以将以下for循环转换为使用IntStream

for (int i =1; i<=5; i++)
{
   nums.add(n.nextInt(45)+1);
}

我非常简单地尝试了以下内容:

IntStream.range(1,5).forEach(nums.add(n.nextInt(45)+1));

但它输出以下错误:

  

不兼容的类型:boolean无法转换为IntConsumer      IntStream.range(1,5).forEach(nums.add(n.nextInt(45)1));

2 个答案:

答案 0 :(得分:9)

您缺少lambda表达式的参数:

IntStream.rangeClosed(1,5).forEach(i -> nums.add(n.nextInt(45)+1));

此外,如果您希望索引从1到5,则需要rangeClosed

尽管如此,有更简洁的方法可以使用IntStream来生成随机数。例如:

Random rand = new Random();
int[] nums = rand.ints(5,1,46).toArray();

答案 1 :(得分:4)

如果nRandom,您可以使用

n.ints(5, 1, 46).forEach(nums::add);

但如果您实际上是在创建列表而不是添加到现有列表,则可以使用

List<Integer> nums = n.ints(5, 1, 46).boxed().collect(Collectors.toList());

通常情况下,您不需要专门的Random实例,ThreadLocalRandom就足够了,效率更高:

List<Integer> nums = ThreadLocalRandom.current().ints(5, 1, 46)
                                      .boxed().collect(Collectors.toList());