我想用随机整数的numberOfElements
个元素填充List,范围为0到numberOfElements/10
。
为什么方法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());
}
答案 0 :(得分:7)
在第二个示例中,来自Random
类的nextInt()
返回一个原语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());
}
但是第一个也通过强制转换返回了一个原始int!
是的,但是它在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()
答案 1 :(得分:0)
将框int
到包装程序对应的类Integer
。另外,您可以尝试以下操作:
public static List<Integer> populateListStream3(int numberOfElements) {
List<Integer> listOfIntegers = new Random().ints(numberOfElements, 0, numberOfElements/10).boxed().collect(Collectors.toList());
return listOfIntegers;
}
答案 2 :(得分:0)
第二个无效,因为您正在使用包含原始int类型的IntStream
。您必须在map()
之前致电boxed()
。但是更好的解决方案是使用mapToObj()
而不是map()
:
public static List<Integer> populateListStream2(int numberOfElements) {
return IntStream.range(0, numberOfElements)
.mapToObj(e -> random.nextInt(numberOfElements / 10))
.collect(Collectors.toList());
}
在这种情况下,值将自动装箱,就像在您的populateListStream2()
方法中一样。
或者,我建议使用Random.ints()
生成一个整数流。