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