【发布时间】:2015-11-15 05:47:03
【问题描述】:
实际任务是能够通过从文件中读取来返回 Stream,但这样做不会将整个文件(或解析的集合)完全加载到内存中。该流的目的可能会在以后确定——例如保存到数据库。开发人员将拥有一个反序列化流(而不是反序列化集合)的句柄。
问题在于不能保证文件中的一行等于一个 MyEntity 对象(在这种情况下,我可以使用这篇文章:http://blog.codeleak.pl/2014/05/parsing-file-with-stream-api-in-java-8.html)
一般来说,我们可能会发现这样一种情况,即提供一个输入流,需要返回一个输出流,该输出流是通过将可变数量的输入流项映射到一个输出流项而构造的。
所以,到目前为止,我的解决方案是使用供应商,如下所示:
public class Parser{
public Stream<MyEntity> parse(final InputStream stream) {
return Stream.generate(new AggregatingSupplier(stream));
}
private class AggregatingSupplier implements Supplier<MyEntity> {
private final Scanner r;
public AggregatingSupplier(final InputStream source) {
this.r= new Scanner(source);
}
@Override
public MyEntity get() {
MyEntity re=new MyEntity();
while (r.hasNextLine() &&!re.isComplete()){
String line=r.nextLine();
// ... do some processing
}
return re;
}
}
}
这种方法的问题是使用 Stream.generate 获得的流是无限的。没有停止条件。抛出异常有效(有点)。或者选择完全不同的(经典)方法。
【问题讨论】:
标签: java stream java-8 java-stream