猿问

如何从内联<填充列表<>?

我想用随机整数的元素填充List,范围为0到。为什么方法有效,无效?numberOfElementsnumberOfElements/10populateListStream1()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());

}


慕田峪9158850
浏览 140回答 3
3回答

MYYA

在第二个示例中,该类中的&nbsp;nextInt()&nbsp;返回一个基元,该基元无法收集到 .添加一个调用,这会将 的 转换为它们的包装类:RandomintListboxedintIntegerpublic&nbsp;static&nbsp;List<Integer>&nbsp;populateListStream2(int&nbsp;numberOfElements){&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IntStream.range(0,numberOfElements) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(e&nbsp;->&nbsp;random.nextInt(numberOfElements/10)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.boxed() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList()); }但是第一个也通过铸造返回了原始的int!是的,但它是在 中,所以它被自动装箱到.您可以通过运行以下操作来判断:StreamIntegerStream.generate(new&nbsp;Random()::nextDouble) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.limit(numberOfElements) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(e&nbsp;->&nbsp;(int)(e*numberOfElements/10)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.peek(e&nbsp;->&nbsp;System.out.println(e.getClass())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());哪些打印:class&nbsp;java.lang.Integer后者是.的好处之一是避免自动装箱和拆箱。除非您显式调用,否则它不会框IntStreamIntStreamboxed()另请注意,Random&nbsp;类中的一些方法已经返回随机数流,如&nbsp;ints()&nbsp;和&nbsp;doubles()

慕丝7291255

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

料青山看我应如是

将其装入包装器对应的类 。另外,您可以尝试如下操作:intInteger&nbsp; public static List<Integer> populateListStream3(int numberOfElements) {&nbsp; &nbsp; &nbsp; &nbsp; List<Integer> listOfIntegers = new Random().ints(numberOfElements, 0, numberOfElements/10).boxed().collect(Collectors.toList());&nbsp; &nbsp; &nbsp; &nbsp; return listOfIntegers;&nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答