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());
哪些打?。?/p>
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;
}
添加回答
舉報