我正在学习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有更简洁的方法吗?
(我显然可以用普通的方式循环......)
由于
答案 0 :(得分:4)
在这种情况下,流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)
的方法,里面有一个常规循环。
没有理由使用此答案中显示的代码,因为它的可读性和替代性都不太可读。这只是演示了如何从无限生成的流中获取有限数量的元素。
答案 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)));