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

Java 对流的每个元素和任何元素执行操作,java,java-8,java-stream,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,我

我希望能够做到这一点:

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));

有什么可以改进的建议吗?

您的第二个代码无法工作,因为您不能对流进行两次处理。不起作用,因为peek不会处理所有项目

但是,没有理由试图将所有内容都放入流操作中,从而使代码复杂化。只需收集到一个集合中:

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);
}
这段代码对读者来说更容易理解