对流的每个元素和任何元素执行操作

时间:2016-11-20 19:41:54

标签: java java-8 java-stream

我希望能够做到这一点:

Arrays.stream(args)
  .map(arg -> new File(arg))
  .filter(file -> !file.isFile())
  .forEach(
    file -> System.out.println(String.format("File %s does not exist", file))
  ).forAny(() -> System.exit(1));

但是由于forEach返回void,我有以下代码:

Stream<File> notExistingFiles = Arrays.stream(args)
  .map(arg -> new File(arg))
  .filter(file -> !file.isFile());
notExistingFiles.forEach(
  file -> System.out.println(String.format("File %s does not exist", file))
);
notExistingFiles.findAny().ifPresent(a -> System.exit(1));

有关如何改进的建议吗?

1 个答案:

答案 0 :(得分:3)

您的第二个代码将无效,因为您无法两次处理Stream。 This solution不起作用,因为peek 处理每个项目。

但是,没有理由通过尝试将所有内容保存到Stream操作来使代码复杂化。只需收集到一个集合:

Set<File> notExistingFiles = Arrays.stream(args)
    .map(File::new).filter(file -> !file.isFile()).collect(Collectors.toSet());

if(!notExistingFiles.isEmpty()) {
    notExistingFiles.forEach(file -> System.out.printf("File %s does not exist%n", file));
    System.exit(1);
}

这段代码对读者来说更容易理解。