如何从迭代器创建Java 8流?

sde*_*ham 27 java java-stream

是否可以从迭代器创建一个Stream,其中对象序列与通过重复调用迭代器的next()方法生成的对象序列相同?我想到的具体情况涉及TreeSet.descendingIterator()返回的迭代器的使用,但我可以想象其他情况下迭代器,而不是它引用的集合是可用的.

例如,对于TreeSet<T> tset我们可以tset.stream()...在集合的排序顺序中编写和获取该集合中的对象流,但是如果我们希望它们以不同的顺序(例如通过使用可用的顺序)descendingIterator()怎么办?我想象的东西,tset.descendingIterator().stream()...或者stream( tset.descendingIterator() )...,虽然这些形式都不是有效的.

Kar*_*ról 49

static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) {
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
}

static <T> Stream<T> iteratorToInfiniteStream(final Iterator<T> iterator) {
    return Stream.generate(iterator::next);
}
Run Code Online (Sandbox Code Playgroud)


and*_*ler 32

对于特定的例子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
    }
}
Run Code Online (Sandbox Code Playgroud)

简而言之,您必须使用其中一个静态方法SpliteratorIterator第一个创建Spliterators.然后你可以Stream使用静态方法创建一个StreamSupport.

我手动创建Spliterators和Streams没有那么多经验,所以我无法评论它们的特征应该是什么或它们会产生什么样的效果.在这个特别简单的例子中,我是否定义了上述特征,或者我是否将其设置为0(即没有特征)似乎并不重要.还有一种Spliterators创建具有初始大小估计的Spliterator 的方法- 我想在这个特定的例子中你可以使用set.size(),但是如果你想处理任意迭代器,我想这不会是这种情况.同样,我不太确定它对性能的影响.