当前位置: 首页 > 知识库问答 >
问题:

Java8:一次应用流映射和过滤器

施彦
2023-03-14

我正在用Java8为一个文件编写一个解析器。使用files.lines读取该文件,并返回一个顺序的

每一行都映射到一个数据对象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);

如我在parseline/_stream.map中所知,如果需要结果,我如何组合映射/筛选操作?

共有1个答案

公孙高轩
2023-03-14

正如注释中已经指出的,流将在一次传递中处理,因此实际上不需要更改任何内容。为此,您可以使用flatmap并让parse返回一个流:

Stream<Result> parse(String _line) {
  .. code here
  Result _result = new Result().
  if (/* line is not needed */) {
    return Stream.empty();
  } else {
    /** parse line into result */
   return Stream.of(_result);
  }
}  

public Stream<Result> parseFile(Path _file) {
  return Files.lines(_file)
              .flatMap(this::parse);
}

这样,首先就不会有任何null值。

 类似资料:
  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 有可能在流中过滤更多次吗?例如,如果我有一个带有ID的列表,我想流一个HashMap,并将HashMap的键映射到列表中的键,以及它们在哪里匹配,我想从HashMap中获取对象,并再次过滤它,例如该对象中的int字段大于3,并在最后求和。例如,如果它发现10种情况,其中列表的键和HashMap的键相等,它过滤这10种情况,并发现3种情况,例如int字段大于3,它最终返回这些的总和。 到目前为止,这

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 我刚开始使用RxJava/RxAndroid,在理解如何正确处理背压方面有一些问题。 我有一个文件扫描器,可以扫描目录并发出文件。应尽快处理这些文件,并且不跳过任何文件。 所以管道看起来像这样:<代码>可观察 不幸的是,我收到了rx。例外情况。缺少背压异常错误。所以我读了关于背压的书,如果我理解正确的话,无损耗选项只是缓冲区和窗口。 我试过了BackPressureBuffer()、buffer(

  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?