Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将迭代器转换为流?_Java_Iterator_Java 8 - Fatal编程技术网

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我不想创建“无限”流。@DmitryGinzburg
Stream.generate(迭代器::下一个)
有效?@DmitryGinzburg,这对有限迭代器不起作用。请参阅流是惰性的:代码仅将流链接到迭代器,但实际的迭代在终端操作之前不会发生。如果同时使用迭代器,则不会得到预期的结果。例如,您可以引入
sourceIterator.next()
在使用流之前,您将看到效果(流不会看到第一项)。@assylias,是的,这真的很好!也许您可以解释一下
Streams.stream(iterator)
       .map(v-> function(v))
       .collect(Collectors.toList());