java - 如何从 IntStream 填充 List<Integer>?

标签 java collections java-stream

我想使用 0 到 numberOfElements/10 范围内的随机整数的 numberOfElements 元素填充列表。 为什么方法 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());
}

最佳答案

在第二个示例中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());
}

But the first one also returned a primitive int through casting!

是的,但它位于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()

关于java - 如何从 IntStream 填充 List<Integer>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601455/

相关文章:

Java:Hashset Vs TreeSet - 我应该什么时候使用另一个?

c# - 将通用 Action<T> 委托(delegate)添加到列表

java - 在构造函数具有非空参数列表的情况下使用构造函数引用

java - Java 中纠缠的 ArrayLists...非常奇怪的问题

java - 为什么我们必须多次调用 Firebase getCurrentUser() ?

java - 解释使用迭代器时集合的同步?

Java Stream 生命周期回调

java - 我是否必须在流读取的列表上进行同步?

java - 如何将结果写入JTextArea

java - 当有人输入过去的日期时,我该如何阻止用户为 Android Studio 执行此操作?