3 回答

TA贡献1877条经验 获得超6个赞
一种方法是从迭代器创建一个拆分器,并将其用作流的基础:
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream<String> targetStream = StreamSupport.stream(
Spliterators.spliteratorUnknownSize(sourceIterator, Spliterator.ORDERED),
false);
一种可能更易读的替代方法是使用Iterable-使用lambda从Iterator创建Iterable非常容易,因为Iterable是一个功能性接口:
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Iterable<String> iterable = () -> sourceIterator;
Stream<String> targetStream = StreamSupport.stream(iterable.spliterator(), false);

TA贡献1816条经验 获得超6个赞
很棒的建议!这是我可重复使用的方法:
public class StreamUtils {
public static <T> Stream<T> asStream(Iterator<T> sourceIterator) {
return asStream(sourceIterator, false);
}
public static <T> Stream<T> asStream(Iterator<T> sourceIterator, boolean parallel) {
Iterable<T> iterable = () -> sourceIterator;
return StreamSupport.stream(iterable.spliterator(), parallel);
}
}
和用法(确保静态导入asStream):
List<String> aPrefixedStrings = asStream(sourceIterator)
.filter(t -> t.startsWith("A"))
.collect(toList());

TA贡献1864条经验 获得超2个赞
在Java 9中,仅使用流就可以做到这一点,但是需要注意。以下朴素的示例将无法显示迭代器的最后一个元素。
Stream.generate(iterator::next)
.takeWhile(i -> iterator.hasNext())
.forEach(System.out::println);
但是,这确实可以正常工作:
Stream.generate(() -> null)
.takeWhile(x -> iterator.hasNext())
.map(n -> iterator.next())
.forEach(System.out::println);
添加回答
举报