2016-11-20 4 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

ストリームを2回処理できないため、2番目のコードは機能しません。 This solutionは機能しません。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); 
} 

このコードは、読者にははるかに理解しやすいものです。

関連する問題