用于输入数据的Java 8 Stream实用程序

Jen*_*olm 1 java parsing java-8 java-stream

想象一下,通过回调或InputStream您需要不断转换为Java 8的某种传入数据Stream.我们不知道传入的数据流何时停止,但我们知道它可以停止.

到目前为止,我已经看到了解决这个问题的两种方法,我对如何实现这一目标的最佳实践感兴趣.主要是因为我必须是某人以前面对的事情.必须有比下面的想法更简单的方法.

1)最简单的方法是将源视为a Supplier并仅用于Stream.generate提供数据:

Stream.generate(() -> blockCallToGetData());
Run Code Online (Sandbox Code Playgroud)

然而,这具有缺点,即流永远不会结束.因此,只要输入源停止发送,流就会一直调用该方法.除非我们自然地抛出一个Runtime异常,但这可能会变得很难看.

2)第二个想法是使用a Iterator(转换为a Spliterator)next方法阻塞,直到我们找到下一个元素.作为一个粗略的例子:

class BlockingIterator implements Iterator<Data> {

  @Override void boolean hasNext() {
    return true;
  }

  @Override Data next() {
    return blockCallToGetData();
  }

}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,我可以通过返回停止流falsehasNext方法.但是,在我们不控制传入数据速度的情况下(例如在回调中),我们需要为迭代器保留一个就绪元素的缓冲区.在有人调用next迭代器之前,这个缓冲区可能会变得无限大.

所以,我的问题是; 将阻塞输入提供给流的最佳做法是什么?

Bri*_*etz 5

这个问题包含一个值得怀疑的假设:将阻塞输入提供给流一种很好的做法.流不是反应性框架; 虽然你可以把它变成一个有着大撬棍的人,但问题可能会在其他地方突然出现.(EG考虑了这些用例并得出结论,我们最好提供能够在一个问题上完成工作而不是在两个工作中完成一半工作的东西.)

如果您需要反应式框架,最佳做法是使用一个.RxJava很棒.