想象一下,有某种或者通过回调或输入数据的InputStream
,你需要不断地转换成一个Java 8 Stream
。 我们不知道传入数据流停止时,但我们知道,它可以停止。
到目前为止,我已经看到了解决这个问题得到的两种方式,我很感兴趣,就如何实现这一目标的最佳实践。 主要是因为我这一定是某个人已经面对过。 必须有这样做比下面的想法更简单的方法。
1)最简单的方法是把源作为一个Supplier
,只需使用Stream.generate
提供数据:
Stream.generate(() -> blockCallToGetData());
但是,这有一个缺点,该流永远不会结束。 因此,只要输入源停止发送,流只是不断调用方法。 除非我们抛出一个运行时异常自然,但是这会变得非常恶劣快。
2)第二个想法是使用一个Iterator
(转换为Spliterator
),其中next
方法块,直到我们找到的下一个元素。 作为粗例如:
class BlockingIterator implements Iterator<Data> {
@Override void boolean hasNext() {
return true;
}
@Override Data next() {
return blockCallToGetData();
}
}
这样做的好处是,我可以通过返回停止流false
的hasNext
方法。 然而,在我们不控制输入数据(如回调)的速度的情况下,我们就需要不断的迭代器准备元素的缓冲区。 该缓冲区可以种植无限大,有人呼吁之前next
的迭代器。
所以,我的问题就去。 什么是服务阻断输入流的最佳做法是什么?