使用Stream API填充集合

时间:2018-03-27 07:35:04

标签: java

我正在学习java.util.stream API,而我正在寻找一种快速用一些数据填充Collection的方法。

我已经提出这个代码来添加5个随机数:

List<Integer> lottery = Stream.of(random.nextInt(90), random.nextInt(90), random.nextInt(90),random.nextInt(90),
random.nextInt(90)).collect(Collectors.toList());

如果我必须添加数百个项目,那将是一个问题。使用java.util.stream API有更简洁的方法吗?

(我显然可以用普通的方式循环......)

由于

3 个答案:

答案 0 :(得分:4)

在这种情况下,流API只会使常规循环变得更复杂,但可以创建IntStream(或Stream<Integer>,具体取决于您转换的位置使用

生成无限随机数的intInteger
IntStream rndStream = IntStream.generate(() -> rnd.nextInt(90));

现在您可以使用limit()创建可以收集的非无限子流,例如

rndStream.limit(5).boxed().collect(Collectors.toList());

然而,这只是流技巧,并且没有优势,比如说有一个名为List<Integer> getRandoms(int number)的方法,里面有一个常规循环。

没有理由使用此答案中显示的代码,因为它的可读性和替代性都不太可读。这只是演示了如何从无限生成的流中获取有限数量的元素。

答案 1 :(得分:3)

使用Random.ints(long, int, int)

此页面上的其他人都在生成流,因为它们可以,但是Java已经有了一个开箱即用的方法fiddle,自Java 8以来可用(因此也就是流的开头)。

就这样使用它:

List<Integer> lottery = rnd.ints(5, 0, 90)
                           .boxed()
                           .collect(Collectors.toList());

指令rnd.ints(5L, 0, 90)表示:“在0(包括)和90(不包括)之间创建5个整数的流”。因此,如果您想要100个数字而不是5个,只需将5更改为100

答案 2 :(得分:0)

应该这样做:

List<Integer> randomList = new ArrayList<>();
SecureRandom random = new SecureRandom();
IntStream.rangeClosed(1,100).forEach(value->randomList.add(random.nextInt(90)));