当前位置: 首页 > 知识库问答 >
问题:

我什么时候应该在Java中使用IntStream.Range?

周阳成
2023-03-14

我想知道什么时候可以有效地使用intstream.range。我不确定intstream.range到底有多有用,有三个原因。

(请将start和end视为整数。)

>

  • 如果我想要一个数组,[start,start+1,...,end-2,end-1],下面的代码要快得多。

    int[] arr = new int[end - start];
    int index = 0;
    for(int i = start; i < end; i++)
        arr[index++] = i;
    

    我不认为仅仅获取从startend-1int数字是有用的。我可以将用于(int I=start;I ,这似乎更容易而且不慢。

    您能告诉我什么时候应该选择intstream.range吗?


  • 共有1个答案

    曹建明
    2023-03-14

    intstream.range有几种用法。

    一种是使用int值本身:

    IntStream.range(start, end).filter(i -> isPrime(i))....
    

    还有一种是做了N次的事情:

    IntStream.range(0, N).forEach(this::doSomething);
    
    int[] arr = IntStream.range(start, end).toArray();
    
    int[] arr = new int[end - start];
    IntStream.range(0, end - start).forEach(i -> arr[i] = i + start);
    

    有一个实用工具方法arrays.setall可以更简洁地完成此操作:

    int[] arr = new int[end - start];
    Arrays.setAll(arr, i -> i + start);
    

    还有arrays.parallelhtml" target="_blank">setall可以并行填充现有数组。在内部,它只是使用intStream并在其上调用Parallel()。这将为多核系统上的大型阵列提供加速。

    我发现关于堆栈溢出的许多答案都涉及到使用intstream.range。您可以使用“搜索”框中的以下搜索条件搜索它们:

    user:1441122 IntStream.range
    

    例如,假设您想要找到数组中数行数增加的位置。结果是第一个数组中的索引数组,其中每个索引指向运行的开始。

    要计算这个值,请注意运行开始于该值小于前一个值的位置。(运行也从位置0开始)。因此:

        int[] arr = { 1, 3, 5, 7, 9, 2, 4, 6, 3, 5, 0 };
        int[] runs = IntStream.range(0, arr.length)
                              .filter(i -> i == 0 || arr[i-1] > arr[i])
                              .toArray();
        System.out.println(Arrays.toString(runs));
    
        [0, 5, 8, 10]
    

    当然,您可以使用for-loop来完成此操作,但我发现在许多情况下使用intstream更好。例如,使用toArray()很容易将未知数量的结果存储到数组中,而使用for-loop则必须处理复制和调整大小,这会分散循环的核心逻辑。

     类似资料:
    • 问题内容: 有什么区别?什么时候应该使用容量为1的对抗? 问题答案: SynchronousQueue更像是一个传递,而LinkedBlockingQueue仅允许单个元素。区别在于对SynchronousQueue的put()调用直到有相应的take()调用 才返回 ,但LinkedBlockingQueue的大小为1,则put()调用(对空队列)将立即返回。 我不能说自己曾经直接使用过Sync

    • 问题内容: 我对使用和翻译有疑问。我了解到,在模型中,我应该使用。但是还有其他地方我也应该使用吗?表单定义呢?它们之间是否存在性能差异? 编辑: 还有一件事。有时候,代替被使用。正如文档所述,仅在将字符串显示给用户之前,才将字符串标记为要翻译,并在可能的最新情况下进行翻译,但是我在这里有点困惑,这与功能相似吗?我仍然很难决定在模型和表格中应该使用哪个。 问题答案: ugettext() 与 uge

    • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

    • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

    • 有没有人遇到过使用场景?由于是默认选项,我看不到你什么时候会使用它。

    • 问题内容: 一个理想的例子是什么时候确切地使用Java中的特定接口,以及适用的任何特定规则。 问题答案: 集合框架是一个不错的选择。 因此,你可以编写如下代码: 如果将来你想使用say 或自己的界面更改实现,那么你要做的就是将第一行更改为: 其余代码将继续进行。