Java 如何将迭代器转换为流?
我正在寻找一种简洁的方法,将一个迭代器转换为一个流,或者更具体地说,将迭代器作为一个流“查看” 出于性能原因,我希望避免在新列表中复制迭代器:Java 如何将迭代器转换为流?,java,iterator,java-8,Java,Iterator,Java 8,我正在寻找一种简洁的方法,将一个迭代器转换为一个流,或者更具体地说,将迭代器作为一个流“查看” 出于性能原因,我希望避免在新列表中复制迭代器: Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator(); Collection<String> copyList = new ArrayList<String>(); sourceIterator.forEachRemainin
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Collection<String> copyList = new ArrayList<String>();
sourceIterator.forEachRemaining(copyList::add);
Stream<String> targetStream = copyList.stream();
但是,我得到了一个NoTouchElementException
(因为没有调用hasNext
)
线程“main”java.util.NoSuchElementException中的异常
位于java.util.AbstractList$Itr.next(AbstractList.java:364)
在Main$$Lambda$1/117596212.get(未知源)
在java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1351)中
位于java.util.Spliterator.ForEachRestaining(Spliterator.java:326)
位于java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
Main.Main(Main.java:20)
我已经查看了,但没有发现任何内容。一种方法是从
迭代器创建拆分器,并将其用作流的基础:
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream<String> targetStream = StreamSupport.stream(
Spliterators.spliteratorUnknownSize(sourceIterator, Spliterator.ORDERED),
false);
一种方法是从迭代器
创建拆分器
,并将其用作流的基础:
Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream<String> targetStream = StreamSupport.stream(
Spliterators.spliteratorUnknownSize(sourceIterator, Spliterator.ORDERED),
false);
好建议!
以下是我对它的看法:
公共类StreamUtils{
公共静态流asStream(迭代器源迭代器){
返回asStream(sourceIterator,false);
}
公共静态流asStream(迭代器sourceIterator,布尔并行){
Iterable Iterable=()->sourceIterator;
返回StreamSupport.stream(iterable.spliterator(),parallel);
}
}
和用法(确保静态导入asStream):
List aprefexedstrings=asStream(sourceIterator)
.filter(t->t.startsWith(“A”))
.collect(toList());
好建议!
以下是我对它的看法:
公共类StreamUtils{
公共静态流asStream(迭代器源迭代器){
返回asStream(sourceIterator,false);
}
公共静态流asStream(迭代器sourceIterator,布尔并行){
Iterable Iterable=()->sourceIterator;
返回StreamSupport.stream(iterable.spliterator(),parallel);
}
}
和用法(确保静态导入asStream):
List aprefexedstrings=asStream(sourceIterator)
.filter(t->t.startsWith(“A”))
.collect(toList());
使用拆分器从迭代器创建拆分器
类包含多个用于创建拆分器的函数,例如,这里我使用拆分器未知化
将迭代器作为参数,然后使用流支持创建流
Spliterator<Model> spliterator = Spliterators.spliteratorUnknownSize(
iterator, Spliterator.NONNULL);
Stream<Model> stream = StreamSupport.stream(spliterator, false);
Spliterator Spliterator=Spliterators.Spliterator未知(
迭代器、拆分器(非空);
Stream=StreamSupport.Stream(spliterator,false);
使用拆分器从迭代器创建拆分器
类包含多个用于创建拆分器的函数,例如,这里我使用拆分器未知化
将迭代器作为参数,然后使用流支持创建流
Spliterator<Model> spliterator = Spliterators.spliteratorUnknownSize(
iterator, Spliterator.NONNULL);
Stream<Model> stream = StreamSupport.stream(spliterator, false);
Spliterator Spliterator=Spliterators.Spliterator未知(
迭代器、拆分器(非空);
Stream=StreamSupport.Stream(spliterator,false);
自版本21以来,Guava library提供
自版本21以来,Guava library提供了
它做了什么。使用Collections.list(迭代器).stream()…使用Collections.list(迭代器).stream()…
这在Java9中是可能的
Stream.generate(() -> null)
.takeWhile(x -> iterator.hasNext())
.map(n -> iterator.next())
.forEach(System.out::println);
这在Java9中是可能的
Stream.generate(() -> null)
.takeWhile(x -> iterator.hasNext())
.map(n -> iterator.next())
.forEach(System.out::println);
并使用Streams.stream(迭代器)
:
并使用Streams.stream(迭代器)
:
在Java 9+上执行此操作的另一种方法是:
Stream.iterate(迭代器,迭代器::hasNext,UnaryOperator.identity())
.map(迭代器::下一步)
.forEach(System.out::println);
在Java 9+上执行此操作的另一种方法是:
Stream.iterate(迭代器,迭代器::hasNext,UnaryOperator.identity())
.map(迭代器::下一步)
.forEach(System.out::println);
1用方法包装的解决方案:
公共静态流到流(迭代器迭代器){
返回StreamSupport.stream(((Iterable)(->iterator).spliterator(),false);
}
2实施(用@Beta
标记):
公共静态流(迭代器迭代器){
返回StreamSupport.stream(Spliterators.spliteratorUnknownSize(迭代器,0),false);
}
1用方法包装的解决方案:
公共静态流到流(迭代器迭代器){
返回StreamSupport.stream(((Iterable)(->iterator).spliterator(),false);
}
2实施(用@Beta
标记):
公共静态流(迭代器迭代器){
返回StreamSupport.stream(Spliterators.spliteratorUnknownSize(迭代器,0),false);
}
可能重复的@DmitryGinzburg-euh我不想创建“无限”流。@DmitryGinzburg流。生成(迭代器::下一步)
工作?@DmitryGinzburg这对有限迭代器不起作用。请参阅可能重复的@DmitryGinzburg-euh我不想创建“无限”流。@DmitryGinzburgStream.generate(迭代器::下一个)
有效?@DmitryGinzburg,这对有限迭代器不起作用。请参阅流是惰性的:代码仅将流链接到迭代器,但实际的迭代在终端操作之前不会发生。如果同时使用迭代器,则不会得到预期的结果。例如,您可以引入sourceIterator.next()
在使用流之前,您将看到效果(流不会看到第一项)。@assylias,是的,这真的很好!也许您可以解释一下
Streams.stream(iterator)
.map(v-> function(v))
.collect(Collectors.toList());