Ответ 1
Для конкретного примера NavigableSet.descendingIterator()
я думаю, что самый простой способ - использовать NavigableSet.descendingSet()
.
Но, учитывая, что вы, вероятно, заинтересованы в более общем случае, кажется, что работает следующее:
import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.TreeSet;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class Streams {
public static void main(String... args) {
TreeSet<String> set = new TreeSet<>();
set.add("C");
set.add("A");
set.add("B");
Iterator<String> iterator = set.descendingIterator();
int characteristics = Spliterator.DISTINCT | Spliterator.SORTED | Spliterator.ORDERED;
Spliterator<String> spliterator = Spliterators.spliteratorUnknownSize(iterator, characteristics);
boolean parallel = false;
Stream<String> stream = StreamSupport.stream(spliterator, parallel);
stream.forEach(System.out::println); // prints C, then B, then A
}
}
Короче, вам нужно сначала создать Spliterator
из Iterator
, используя один из статических методов в Spliterators
. Затем вы можете создать Stream
, используя статические методы в StreamSupport
.
У меня не так много опыта с созданием Spliterators и Streams вручную, поэтому я не могу прокомментировать, какими должны быть характеристики или какой эффект они будут иметь. В этом конкретном простом примере, казалось, не имеет значения, определил ли я характеристики, как указано выше, или установил ли я его 0 (т.е. Никаких характеристик). Существует также метод в Spliterators
для создания Spliterator с начальной оценкой размера. Предположим, что в этом конкретном примере вы можете использовать set.size()
, но если вы хотите обрабатывать произвольные итераторы, я думаю, это не так. Опять же, я не совсем уверен, какой эффект он оказывает на производительность.