对于产生反向的特定问题IntStream,请尝试如下操作:
static IntStream revRange(int from, int to) {
return IntStream.range(from, to)
.map(i -> to - i + from - 1);
}
这样可以避免装箱和分类。
对于如何反转任何类型的流的一般问题,我不知道有一种“正确”的方法。我可以想到几种方法。两者最终都存储了流元素。我不知道在不存储元素的情况下反转流的方法。
第一种方法将元素存储到数组中,然后以相反的顺序将它们读出到流中。请注意,由于我们不知道流元素的运行时类型,因此我们无法正确键入数组,这需要未经检查的强制转换。
@SuppressWarnings("unchecked")
static Stream reverse(Stream input) {
Object[] temp = input.toArray();
return (Stream) IntStream.range(0, temp.length)
.mapToObj(i -> temp[temp.length - i - 1]);
}
另一种技术是使用收集器将项目累积到反向列表中。这会在ArrayList对象的前面进行很多插入操作,因此有很多复制正在进行。
Stream input = ... ;
List output =
input.collect(ArrayList::new,
(list, e) -> list.add(0, e),
(list1, list2) -> li