【问题标题】:How to generate random array of ints using Stream API Java 8?如何使用 Stream API Java 8 生成随机整数数组?
【发布时间】:2014-09-11 16:56:07
【问题描述】:

我正在尝试使用 Java 8 中的新 Stream API 生成随机整数数组。但我还没有清楚地理解这个 API。所以我需要帮助。这是我的代码。

Random random = new Random();
IntStream intStream = random.ints(low, high);
int[] array =  intStream.limit(limit) // Limit amount of elements
                                    .boxed() // cast to Integer
                                    .toArray();

但此代码返回对象数组。它有什么问题?

【问题讨论】:

    标签: java arrays java-8 java-stream


    【解决方案1】:

    如果您想要原始的int 值,请不要调用IntStream::boxed,因为它会通过boxing 生成Integer 对象。

    只需使用Random::ints,它会返回一个IntStream

    int[] array = new Random().ints(size, lowBound, highBound).toArray();
    

    【讨论】:

    • 你能解释一下使用 boxed 的目的是什么吗?
    • @ketazafor:如果您确实想要一个对象数组而不是 int[],则只想使用 boxed()。这就是你的全部问题。
    • 谢谢回答,还有一个问题是有什么优雅的方法可以使用流 api 生成随机字符串?
    • @ketazafor:取决于你的随机String 应该如何构造。如果它应该将每个随机的int 解释为代码点,请将这个答案的int 流与“Simplest way to print an IntStream as a String”结合起来
    【解决方案2】:

    生成 0 到 350 范围内的随机数,将结果限制为 10,并作为 List 收集。以后可以进行类型转换。

    但是,不能保证返回的 List 的类型、可变性、可序列化性或线程安全性。

    List<Object> numbers =  new Random().ints(0,350).limit(10).boxed().collect(Collectors.toList());
    

    并获得 int 数组使用

    int[] numbers =  new Random().ints(0,350).limit(10).toArray();
    

    【讨论】:

    • 谢谢。我还是流的新手,而 .boxed() 正是我在这里寻找的。​​span>
    【解决方案3】:

    没有理由boxed()。只需将Stream 作为int[] 接收即可。

    int[] array = intStream.limit(limit).toArray();
    

    【讨论】:

      【解决方案4】:

      tl;博士

      ThreadLocalRandom     // A random number generator isolated to the current thread.
      .current()            // Returns the current thread's `ThreadLocalRandom` object.
      .ints( low , high )   // Pass the "origin" (inclusive) and "bound" (exclusive).
      .limit( 100 )         // How many elements (integers) do you want in your stream?
      .toArray()            // Convert the stream of `int` values into an array `int[]`. 
      

      ThreadLocalRandom

      您可以使用ThreadLocalRandom 来完成。

      ints 方法在您指定的范围内生成一个IntStream。请注意,低位是包含,而高位是独占。如果你想包含你的高数,只需在调用ints 方法时添加一个。

      int[] randInts = ThreadLocalRandom.current().ints( low , high ).limit(100).toArray();
      

      看到这个code run live at IdeOne.com

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多