我想使用 0 到 numberOfElements/10
范围内的随机整数的 numberOfElements
元素填充列表。
为什么方法 populateListStream1()
有效而 populateListStream2()
无效?
public static List<Integer> populateListStream1(int numberOfElements) {
return Stream.generate(new Random()::nextDouble)
.limit(numberOfElements)
.map(e -> (int)(e*numberOfElements/10))
.collect(Collectors.toList());
}
public static List<Integer> populateListStream2(int numberOfElements) {
return IntStream.range(0,numberOfElements)
.map(e -> random.nextInt(numberOfElements/10))
.collect(Collectors.toList());
}
最佳答案
在第二个示例中nextInt()
Random
类返回一个原始 int
,它无法收集到 List
中。添加对 boxed
的调用,这会将 int
转换为其包装类 Integer
:
public static List<Integer> populateListStream2(int numberOfElements){
return IntStream.range(0,numberOfElements)
.map(e -> random.nextInt(numberOfElements/10))
.boxed()
.collect(Collectors.toList());
}
But the first one also returned a primitive int through casting!
是的,但它位于Stream
中,因此它被自动装箱为Integer
。您可以通过运行来判断:
Stream.generate(new Random()::nextDouble)
.limit(numberOfElements)
.map(e -> (int)(e*numberOfElements/10))
.peek(e -> System.out.println(e.getClass()))
.collect(Collectors.toList());
打印内容:
class java.lang.Integer
后者是一个IntStream
。 IntStream
的好处之一是避免自动装箱和拆箱。除非您显式调用 boxed()
关于java - 如何从 IntStream 填充 List<Integer>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601455/