2016-11-20 6 views
-1

Ich möchte in der Lage sein, dies zu tun:Führen Sie eine Aktion für jedes Element eines Stroms und für jedes Element

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

aber da forEach kehrt void ich den folgenden Code haben:

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

Irgendwelche Vorschläge, wie dies verbessert werden kann?

+2

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

Antwort

3

Ihr zweiter Code wird nicht funktionieren, da Sie einen Stream nicht zweimal verarbeiten können. This solution funktioniert nicht, wie peek tut nicht verarbeiten Sie jeden Artikel.

Es gibt jedoch keinen Grund, den Code zu komplizieren, indem Sie versuchen, alles in Stream-Aktionen zu bailen. Sammeln Sie einfach in eine Sammlung:

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

Dieser Code ist für den Leser viel einfacher zu verstehen.

Verwandte Themen