我希望能够做到这一点:
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));
有关如何改进的建议吗?
答案 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);
}
这段代码对读者来说更容易理解。