如何从IntStream填充List <integer>?

时间:2019-04-09 21:17:37

标签: java collections java-stream

我想用随机整数的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());
}

3 个答案:

答案 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

后者是IntStreamIntStream的好处之一是避免自动装箱和拆箱。除非您明确呼叫boxed()

,否则它不会装箱

还请注意,Random类中的某些方法已经返回了Stream个随机数,例如ints()doubles() < / p>

答案 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()生成一个整数流。