Ich habe ein Problem mit dem Stream von Java 8 für jeden Versuch, mit dem nächsten Element in der Schleife fortzufahren. Ich kann den Befehl nicht so einstellen continue;
, return;
funktioniert nur, aber in diesem Fall verlassen Sie die Schleife. Ich muss mit dem nächsten Element in der Schleife fortfahren. Wie kann ich das machen?
Beispiel (funktioniert nicht):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).foreach(line -> {
...
if(...)
continue; // this command doesn't working here
});
}
Beispiel (funktioniert):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).collect(Collectors.toList());
}
for(String filteredLine : filteredLines){
...
if(...)
continue; // it's working!
}
continue
immer noch ohne funktionale Änderungen zum nächsten Element übergehen würde.else
Block. Wenn es danach nichts mehr gibtcontinue
, lassen Sie den if-Block fallen und fahren Sie fort: Sie sind nutzlos.Antworten:
Die Verwendung
return;
funktioniert einwandfrei. Es wird nicht verhindert, dass die vollständige Schleife abgeschlossen wird. Die aktuelle Iteration derforEach
Schleife wird nur nicht mehr ausgeführt .Probieren Sie das folgende kleine Programm aus:
Ausgabe:
Beachten Sie, wie das
return;
für dieb
Iteration ausgeführt wird, aberc
auf der folgenden Iteration gut gedruckt wird.Warum funktioniert das?
Der Grund, warum das Verhalten zunächst nicht intuitiv erscheint, ist, dass wir es gewohnt sind, dass die
return
Anweisung die Ausführung der gesamten Methode unterbricht. In diesem Fall erwarten wir, dass diemain
gesamte Methodenausführung angehalten wird.Was jedoch verstanden werden muss, ist, dass ein Lambda-Ausdruck wie:
... muss wirklich als eine eigene "Methode" betrachtet werden, die völlig unabhängig von der
main
Methode ist, obwohl sie sich bequem darin befindet. Diereturn
Anweisung stoppt also nur die Ausführung des Lambda-Ausdrucks.Das zweite, was verstanden werden muss, ist Folgendes:
... ist wirklich nur eine normale Schleife unter der Decke, die den Lambda-Ausdruck für jede Iteration ausführt.
Unter Berücksichtigung dieser beiden Punkte kann der obige Code auf folgende äquivalente Weise umgeschrieben werden (nur zu Bildungszwecken):
Mit diesem "weniger magischen" Code-Äquivalent wird der Umfang der
return
Anweisung deutlicher.quelle
Eine andere Lösung: Gehen Sie mit Ihren invertierten Bedingungen durch einen Filter: Beispiel:
kann durch ersetzt werden
Der einfachste Ansatz scheint die Verwendung von "return" zu sein. obwohl.
quelle
Das Lambda, an das Sie übergeben,
forEach()
wird für jedes vom Stream empfangene Element ausgewertet. Die Iteration selbst ist im Bereich des Lambda nicht sichtbar, daher können Sie sie nichtcontinue
wieforEach()
ein C-Präprozessor-Makro anzeigen. Stattdessen können Sie den Rest der darin enthaltenen Anweisungen bedingt überspringen.quelle
Sie können eine einfache
if
Anweisung verwenden, anstatt fortzufahren. Anstelle der Art und Weise, wie Sie Ihren Code haben, können Sie Folgendes versuchen:Das Prädikat in der if-Anweisung ist genau das Gegenteil des Prädikats in Ihrer
if(pred) continue;
Anweisung. Verwenden Sie also einfach!
(logisch nicht).quelle