【问题标题】:Stream API, is there way to iterate descending using instream.range? [duplicate]Stream API,有没有办法使用 instream.range 迭代降序? [复制]
【发布时间】:2022-01-08 12:08:48
【问题描述】:

例如, Instream.range(0,10) - 从 0 索引迭代到 10。

Instream.range(10,0) - 但是从 10 到 0 不起作用,如何使用 Stream API 来做到这一点?

【问题讨论】:

  • 这能回答你的问题吗? Java 8 stream reverse order
  • @Apokralipsa 如果可能的话,我建议在这种情况下避免排序,因为排序是有状态的操作。

标签: java java-stream


【解决方案1】:

你可以使用IntStream.iterate(initialValue, hasNext, next):

IntStream.iterate(10, i -> i >= 0, i -> i - 1)

如果你被 java 8 卡住了:

IntStream.iterate(10, i -> i - 1).limit(11)

【讨论】:

  • 我推荐i-1 而不是--i
【解决方案2】:

您不能使用 range() 生成降序流。 Java doc 清楚地指定步骤是增量 1。如果有提供步骤的选项,那么我们可以。但是,您可以通过不同的方式实现相同的目标。

IntStream.iterate(10, i -> i >= 1, i -> --i)


IntStream.rangeClosed(1, 10).boxed().sorted(Comparator.reverseOrder())


IntStream.range(-10, 0).map(i -> -i)

在这三种使用和迭代方法中,最好的方法。

【讨论】:

  • "sorted" 这很糟糕,因为它在你可以使用它之前将所有值保存在内存中
  • 是的,我知道这很糟糕,我只是列出了可能的方法。我还在最后添加了一个注释。
【解决方案3】:

如果您希望在开始/结束转置时重复相同的一组数字,那么这将替换start > end 时的范围:

IntStream range(int start, int end) {
    return start < end ? IntStream.range(start,end) 
                       : IntStream.range(-start+1, -end+1).map(i -> -i);
}
range(2,5).forEach(System.out::println);
2
3
4

range(5,2).forEach(System.out::println)
4
3
2

如果要保留 (startInclusive, endExclusive) 的含义,修改为:

IntStream range2(int start, int end) {
    return start < end ? IntStream.range(start,end) 
                       : IntStream.range(-start, -end).map(i -> -i);
}

range2(5,2).forEach(System.out::println)
5
4
3

【讨论】:

    【解决方案4】:

    另一个权衡解决方案是修改范围值,如:

        int exclusiveEnd = 10;
        IntStream.range(0, exclusiveEnd).forEach((i) -> {
            System.out.println(exclusiveEnd - 1 - i);
        });
    

    【讨论】:

      【解决方案5】:

      range 之后使用map 计算新值:

      IntStream.range(0, 10).map(i -> 10 - i); // 10, 9, .. 1
      IntStream.rangeClosed(0, 10).map(i -> 10 - i); // 10, 9, .. 0
      

      【讨论】:

        猜你喜欢
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 2016-09-23
        相关资源
        最近更新 更多