3 回答

TA贡献1868条经验 获得超4个赞
在第二个示例中,该类中的 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()); }
但是第一个也通过铸造返回了原始的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()
另请注意,Random
类中的一些方法已经返回随机数流
,如 ints()
和 doubles()

TA贡献1859条经验 获得超6个赞
第二个不起作用,因为您使用的是包含基元 int 类型的 IntStream
。您必须在 之前致电盒装()
。但更好的解决方案是使用 mapToObj()
而不是:map()
map()
public static List<Integer> populateListStream2(int numberOfElements) { return IntStream.range(0, numberOfElements) .mapToObj(e -> random.nextInt(numberOfElements / 10)) .collect(Collectors.toList()); }
在这种情况下,值将像在方法中一样自动装箱。populateListStream2()
或者,我建议使用随机.ints()
来生成一个整数流。

TA贡献1772条经验 获得超8个赞
将其装入包装器对应的类 。另外,您可以尝试如下操作:intInteger
public static List<Integer> populateListStream3(int numberOfElements) {
List<Integer> listOfIntegers = new Random().ints(numberOfElements, 0, numberOfElements/10).boxed().collect(Collectors.toList());
return listOfIntegers;
}
添加回答
举报