2016-11-20 29 views
-1

我希望能够做到这一点:一个流的每个元素执行操作和任何元素

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

任何建议如何改善?

+2

http://codereview.stackexchange.com/ – Reimeus

回答

3

您的第二个代码将无法正常工作,因为您无法两次处理流。 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); 
} 

此代码是更容易理解的读者。

相关问题