我只是在学习java.util.stream
API,我正在寻找一种用一些数据快速填充集合的方法。
我想出了这段代码来添加 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 来做到这一点?
(我显然可以用普通的方式循环...
谢谢
在这种情况API 只会使事情比常规循环更复杂,但您可以创建一个IntStream
(或Stream<Integer>
,具体取决于您将int
转换为Integer
的位置),它生成无限的随机数
IntStream rndStream = IntStream.generate(() -> rnd.nextInt(90));
现在,您可以使用limit()
创建可以收集的非无限子流,例如
rndStream.limit(5).boxed().collect(Collectors.toList());
然而,这只是流欺骗,与使用一种名为List<Integer> getRandoms(int number)
的方法相比没有任何优势,并且内部有一个规则循环。
没有理由使用此答案中显示的代码,因为它比替代方案更易读且更复杂。这只是演示了如何从无限生成的流中获取有限数量的元素。
使用Random.ints(long, int, int)
此页面上的其他人都在生成流,因为他们可以,但是 Java 已经有这样一个开箱即用的方法,Random.ints(long, int, int)
,从 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
.
这应该可以:
List<Integer> randomList = new ArrayList<>();
SecureRandom random = new SecureRandom();
IntStream.rangeClosed(1,100).forEach(value->randomList.add(random.nextInt(90)));