没有什么充分的理由List
不能有降序迭代器。每一个List
需要支持一个ListIterator
可以使用相反的顺序迭代hasPrevious()
and previous()
方法。不过,这似乎是一个相当不常见的用例。
这是一个小实用方法,可以适应Iterable
to a ListIterator
以相反顺序迭代:
static <T> Iterable<T> descendingIterable(List<? extends T> list) {
return () -> {
ListIterator<? extends T> li = list.listIterator(list.size());
return new Iterator<T>() {
public boolean hasNext() { return li.hasPrevious(); }
public T next() { return li.previous(); }
};
};
}
您可以使用它来实现您的示例:
List<String> list = Arrays.asList("Hello", "2", "Chocolate", "10");
StringJoiner sj = new StringJoiner(" ");
descendingIterable(list).iterator().forEachRemaining(sj::add);
System.out.println(sj);
10 Chocolate 2 Hello
或者您可以在增强的 for 循环中使用它:
for (String s : descendingIterable(list)) {
System.out.println(s);
}
10
Chocolate
2
Hello
我最初让这个创建了一个Iterator
而不是Iterable
,但后者更有用,因为它可以在增强的 for 循环中使用。
还要注意这里有一个小问题,那就是如果List
可以同时修改。这发生在此处的代码中:
list.listIterator(list.size())
如果可能,您必须在列表上使用外部同步,或者如果列表是CopyOnWriteArrayList
,你必须先克隆它。看这个答案 https://stackoverflow.com/a/42046731/1441122有关后者的更多信息。