是否有一种方法可以制作一个Stream块并等待数据源中的数据准备好,然后在我知道没有其他要等待的时候关闭它?我已经尝试使数据源成为一个像created_at_modified
2019-06-30 16:45:04.000
这样的阻塞源,但是由于我使用BlockingQueue
而不是forEeach
或take
在流上循环,因此它显然无法正常工作阻止功能。
答案 0 :(得分:2)
围绕Spliterator
设计流是其元素的最终来源。您可以实现tryAdvance()
方法来测试是否存在另一个元素,直到知道结果为止都进行阻塞。
您提到了BlockingQueue
,它在并发处理中很有用。如果要在某些线程中“生成”元素,并尝试在其他线程中“使用”元素,则可能会发现CompletionService
比自定义Stream
更适合您的应用程序。
Spliterator
就其操作而言是一个非常简单的界面,但是正确实现它需要对spliterator "characteristics".有一个很好的理解,我认为这是一个高级主题,并且在某些情况下,自定义实现很有用,也可能是一个警告信号,表明您使用的方法不正确-您不必对所有内容都使用Stream
。
(用StreamSupport.stream()
从Stream
创建Spliterator
。)
答案 1 :(得分:0)
我想这应该起作用:
BlockingQueue<T> queue = ...; // Signal with a null sentinel.
Iterable<T> collection = () -> new Iterator<T>() {
private boolean hasCurrent;
private T current;
public boolean hasNext() {
if (!hasCurrent) {
current = queue.take();
hasCurrent = true;
}
return current != null;
}
public T next() {
if (hasCurrent) {
hasCurrent = false;
return current;
} else {
return queue.take();
}
}
};
StreamSupport.stream(collection.spliterator(), false)...
可能还有更好的方法。