Java 8流反转顺序

231

一般问题:如何正确地反转一个流?假设我们不知道这个流包含什么类型的元素,有什么通用方法可以反转任何流?

具体问题:

IntStream提供了range方法来在特定范围内生成整数IntStream.range(-range,0),现在我想将其反转,从0到负数的切换范围行不通,也无法使用Integer::compare

List<Integer> list = Arrays.asList(1,2,3,4);
list.stream().sorted(Integer::compare).forEach(System.out::println);

使用 IntStream 我会得到以下编译错误:

Error:(191, 0) ajc: The method sorted() in the type IntStream is not applicable for the arguments (Integer::compare)

我错过了什么?


2
一个 IntStream 没有 .sorted(Comparator) 方法;你必须先通过一个 Stream<Integer> 并在那里反转后再产生一个 IntStream - fge
5
要生成倒序的 IntStream.range(0, n),可以使用类似于 map(i -> n - i - 1) 的方式。无需进行装箱和排序。 - Stuart Marks
3
您的一般问题和具体问题看起来像是两个完全不同的问题。一般问题谈论的是反转“流”,而具体问题则谈论将数字按降序排序。如果该“流”以无序方式生成数字,例如 1, 3, 2,您期望的结果是什么?您想要倒转后的“流”,例如 2, 3, 1,还是排序后的“流”,例如 3, 2, 1 - chiccodoro
10
通常情况下,你无法反转一个流 - 例如,流可能是无限的。 - assylias
1
您可能想要重新提出问题,作为“以Java 8的方式反向迭代集合”。答案可能超出流。下面来自@venkata-raju的答案解决了这个问题,但需要额外的空间。我仍在等待看到这个问题的好答案。 - Manu Manjunath
显示剩余5条评论
31个回答

-1

Java 8 的实现方式:

    List<Integer> list = Arrays.asList(1,2,3,4);
    Comparator<Integer> comparator = Integer::compare;
    list.stream().sorted(comparator.reversed()).forEach(System.out::println);

4
这是按相反顺序排序,而不是将列表还原。 - Jochen Bedersdorfer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接