假设您有一个懒散的Iterator
,您想将其转换为Stream
。可以假设Iterator
中的元素数是有限的。
可以指示Iterator
跳过元素(通过实现中的skip
方法)以避免不必要的元素生成,但是Iterator
的所有元素必须都是Stream
调用了终端操作后会跳过或生成。
我知道:
StreamSupport.stream(
Spliterators.spliteratorUnknownSize(
theIterator, Spliterator.ORDERED), false);
用于从Stream
生成Iterator
,但是,这不提供跳过或确保消耗所有元素的方法。
是否有任何基本的Stream
实现方式都可以通过合理的简单扩展来实现?
鉴于Stream
接口的方法数量众多,但似乎并没有保证哪个方法将调用其他方法作为内部实现的一部分,因此委托似乎很混乱,并且所有JDK实现都可以用作起点(至少在我使用的JDK中)是包私有的,并且我认为有充分的理由(例如,他们不希望 me 扩展它们...)。
答案 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
通过我的快速测试,它可以完成我想要的一切,但是几乎可以肯定的是,在快速测试它时并没有遇到问题。