【发布时间】:2015-01-02 23:19:15
【问题描述】:
我正在为 Java 8 中的文件编写解析器。使用 Files.lines 读取文件并返回顺序的 Stream<String>。
每一行都映射到一个数据对象Result,如下所示:
Result parse(String _line) {
// ... code here
Result _result = new Result().
if (/* line is not needed */) {
return null;
} else {
/* parse line into result */
return _result;
}
}
现在我们可以将流中的每一行映射到相应的结果:
public Stream<Result> parseFile(Path _file) {
Stream<String> _stream = Files.lines(_file);
Stream<Result> _resultStream = _stream.map(this::parse);
}
但是,流现在包含我要删除的 null 值:
parseFile(_file).filter(v -> v != null);
如果需要结果,我如何结合 map/filter 操作,正如我在 parseLine/_stream.map 中已经知道的那样?
【问题讨论】:
-
我不明白,
return Files.line(_file).map(this::parse).filter(v -> v != null);有什么问题? -
流将在一次运行中处理,并且仅当您使用需要完全迭代的终端操作(例如 forEach、collect、reduce)时。
-
@user3001 见stackoverflow.com/questions/23696317/…
-
您关于多次通过的假设是不正确的。过滤和映射在单程中处理。 (一般来说,整个管道都是一次性处理的,除非有像排序这样的操作必须在产生任何数据之前查看所有数据。)
标签: java lambda java-8 java-stream