流 API,有没有办法使用 instream.range 进行降序迭代?

Stream API, is there way to iterate descending using instream.range?

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

Instream.range(10,0) - 但是从 10 到 0 不工作,如何使用 Stream API?

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

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

如果您遇到 java 8:

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

您不能使用 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)

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

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

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

range之后使用map计算新值:

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

如果您希望在 start/end 转置后重复相同的一组数字,那么这将替换范围 if 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