如何使用Java 8的Stream API生成随机整数数组?

31
我正在尝试使用Java 8中的新Stream API生成随机整数数组,但我还没有完全理解这个API。所以我需要帮助。以下是我的代码。

我正在尝试使用Java 8中的新Stream API生成随机整数数组,但我还没有完全理解这个API。所以我需要帮助。以下是我的代码。

Random random = new Random();
IntStream intStream = random.ints(low, high);
int[] array =  intStream.limit(limit) // Limit amount of elements
                                    .boxed() // cast to Integer
                                    .toArray();

但是这段代码返回了对象数组。它有什么问题吗?

4个回答

58
如果你需要原始的 int 值,请不要调用 IntStream::boxed 方法,因为它将通过 装箱 操作生成 Integer 对象。

相反,使用 Random::ints 方法返回一个 IntStream

int[] array = new Random().ints(size, lowBound, highBound).toArray();

1
请问您能否解释一下使用boxed的目的是什么? - user3991417
5
只有在需要对象数组而不是int[]时才应使用boxed()。这就是你整个问题的关键所在。 - Louis Wasserman
谢谢回答,还有一个问题,是否有一种优雅的方式使用流API生成随机字符串? - user3991417
1
@ketazafor:这取决于你想如何构造随机的String。如果它应该将每个随机的int解释为代码点,请将此答案的int流与“[将IntStream打印为String的最简单方法](https://dev59.com/UGIj5IYBdhLWcg3wb0rX#20268845)”结合起来。 - Holger

7
生成随机数,范围从0到350之间,限制结果为10,并将它们收集为列表。稍后可以进行类型转换。
然而,无法保证返回的列表的类型、可变性、可序列化性或线程安全性。
List<Object> numbers =  new Random().ints(0,350).limit(10).boxed().collect(Collectors.toList());

要获取整数数组,请使用以下代码:

int[] numbers =  new Random().ints(0,350).limit(10).toArray();

谢谢。我对流还不太熟悉,.boxed()正是我在这里寻找的。 - Stephan Henningsen

5
没有理由使用 boxed()。只需要将Stream作为int[]接收即可。
int[] array = intStream.limit(limit).toArray();

4

简述

ThreadLocalRandom     // A random number generator isolated to the current thread.
.current()            // Returns the current thread's `ThreadLocalRandom` object.
.ints( low , high )   // Pass the "origin" (inclusive) and "bound" (exclusive).
.limit( 100 )         // How many elements (integers) do you want in your stream?
.toArray()            // Convert the stream of `int` values into an array `int[]`. 

ThreadLocalRandom

你可以使用ThreadLocalRandom来实现。

ints方法在您指定的范围内生成一个IntStream。请注意,下限是包含的,而上限是不包含的。如果你想要包含上限数字,只需要在调用ints方法时加一即可。

int[] randInts = ThreadLocalRandom.current().ints( low , high ).limit(100).toArray();

可以在IdeOne.com上实时查看此代码的运行情况


如果您使用 Random.ints 的三个参数版本,则无需调用 .limit。请参见我在类似问题上的答案 - Basil Bourque

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