此答案已经提供了从Spliterator中创建Iterator的解决方案:
Iterator
应当强调的是,生成的Iterator与其他任何Spliterator一样懒惰,因为它不会在开始执行终端操作之前处理任何项目,并且如果终端操作发生短路,则只会迭代所需的尽可能多的项目。 。
尽管如此,它仍有改进的空间。 如果有一种直接处理所有元素的方法,我总是会添加Iterator方法。 对于大多数非短路操作,将由Spliterator实现调用该方法:
public static Stream enumerationAsStream(Enumeration e) {
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(
new Iterator() {
public T next() {
return e.nextElement();
}
public boolean hasNext() {
return e.hasMoreElements();
}
public void forEachRemaining(Consumer super T> action) {
while(e.hasMoreElements()) action.accept(e.nextElement());
}
},
Spliterator.ORDERED), false);
}
但是,上面的代码是“使用Iterator,因为它非常熟悉”反模式的受害者。 创建的Spliterator将被包装到新的Iterator接口的实现中,与直接实现Spliterator相比,它没有任何优势:
public static Stream enumerationAsStream(Enumeration e) {
return StreamSupport.stream(
new Spliterators.AbstractSpliterator(Long.MAX_VALUE, Spliterator.ORDERED) {
public boolean tryAdvance(Consumer super T> action) {
if(e.hasMoreElements()) {
action.accept(e.nextElement());
return true;
}
return false;
}
public void forEachRemaining(Consumer super T> action) {
while(e.hasMoreElements()) action.accept(e.nextElement());
}
}, false);
}
在源代码级别上,此实现与基于Iterator的实现一样简单,但是消除了从Spliterator到Iterator的委派,只需要其读者了解新的API。