流 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
例如,
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