Java`Iterator`到`Stream`,在终端操作时消耗`Iterator`

时间:2019-05-31 01:30:07

标签: java java-8 iterator java-stream

假设您有一个懒散的Iterator,您想将其转换为Stream。可以假设Iterator中的元素数是有限的。

可以指示Iterator跳过元素(通过实现中的skip方法)以避免不必要的元素生成,但是Iterator的所有元素必须都是Stream调用了终端操作后会跳过或生成。

我知道:

StreamSupport.stream(
        Spliterators.spliteratorUnknownSize(
                theIterator, Spliterator.ORDERED), false);

用于从Stream生成Iterator,但是,这不提供跳过或确保消耗所有元素的方法。

是否有任何基本的Stream实现方式都可以通过合理的简单扩展来实现?

鉴于Stream接口的方法数量众多,但似乎并没有保证哪个方法将调用其他方法作为内部实现的一部分,因此委托似乎很混乱,并且所有JDK实现都可以用作起点(至少在我使用的JDK中)是包私有的,并且我认为有充分的理由(例如,他们不希望 me 扩展它们...)。

1 个答案:

答案 0 :(得分:0)

好吧,我在这方面摇摆不定。这个想法是在为open System let waitForAnyKey = Async.FromContinuations (fun (cont, _, _) -> printfn "%s" "waiting for a key" cont (Console.ReadKey ()) printfn "%s" "got a key" ) let test () = async { let! key = waitForAnyKey printfn "%O" key.Key } |> Async.RunSynchronously test () 读取json数组的TypeAdapter时为Stream创建一个gson,而不必转换每个元素:

https://github.com/BeUndead/gson-stream

通过我的快速测试,它可以完成我想要的一切,但是几乎可以肯定的是,在快速测试它时并没有遇到问题。