首页 > 解决方案 > 在 Streams 中使用 Optional

问题描述

我想知道在 Java 8 中使用流时是否有比我通常使用的过滤和解包 Optional 的替代方法。

这是一些代码片段,它在产生一些降价时使用 Optional 作为文件错误处理的一部分,这可能会因 IO 异常而失败,我正在处理失败列表。

files.stream()
  .map(f -> {
      try {
          return Optional.of(generateMarkdown(f));
      } catch (IOException e) {
          failed.add(f);
      }
      return Optional.<Markdown>empty();
  })
  .filter(o -> o.isPresent())
  .map(o -> o.get())
  .forEach(h -> { ...

有没有更好的方法来编写.filterand.map行,或者重写 .map 块不需要它们?

标签: java

解决方案


使用 shmosel提供的答案 很简洁。但是,在 “将 Java 8 的 Optional 与 Stream::flatMap 一起使用”中讨论了 Java 8 和 9+ 的许多有趣答案。

重写后的代码如下所示:

files.stream()
  .map(f -> {
      try {
          return generateMarkdown(f);
      } catch (IOException e) {
          failed.add(f);
      }
      return null;
  })
  .filter(Objects::nonNull)
  .forEach(h -> { ...

推荐阅读