Lambda - Block vs "Anweisungsliste"

Neumi5694

Top Contributor
Allgemeine Frage.
Meine IDE schlägt mir immer wieder vor, for-each Schleifen in Lambda-Ausdrücke umzuwandeln. Ob nun der Overhead sinnvoll ist oder nicht, lassen wir mal dahingestellt.
Aber wenn ich das dann mal machen lasse, dann ist das Ergebnis manchmal recht schräg.

Ausgangslage:
[CODE lang="java" title="for-each Ausdruck"] List<MyClass> list = ...;
for (var r : list) {
r.doThis();
r.doThat();
r.doSomethingElseEven();
}
[/CODE]

Erwarten würde ich mir nach der Konvertierung so was:
[CODE lang="java" title="Erwarteter funktionaler Ausdruck"] List<MyClass> list;
list.stream().forEachOrdered(r -> {
r.doThis();
r.doThat();
r.doSomethingElseEven();
});
[/CODE]

Es kommt aber folgendes heraus:
[CODE lang="java" title="Ergebnis"] List<MyClass> list = ...;
list.stream().map(r -> {
r.doThis();
return r;
}).map(r -> {
r.doThat();
return r;
}).forEachOrdered(r -> {
r.doSomethingElseEven();
});
[/CODE]

Es wird also jeweils nur ein Befehl ausgeführt, das Objekt dann per Mapping an einen weiteren Lambda-Ausdruck weitergereicht, dort dann der nächste ausgeführt und und und ...

Ich konnte noch keinen Hinweis dazu finden, warum das so gemacht wird. Gibt es einen praktischen Grund dafür? Hat man in funktionaler Programmierung so irgendwelche Geschwindigkeitsvorteile?
Kann das was mit der Pipeline der Prozessoren zu tun haben? Ich war eigentlich der Meinung, dass diese auch mehrere einzelne Kommandos hintereinander ausführen kann ohne dass ein Objekt explizit weitergereicht wird, das ist nur mal reine Spekulation.
 

LimDul

Top Contributor
Persönlich würde ich auf diese "Optimierungen" nicht viel geben.

Bei Eclipse ignoriere ich fast alles, was mir Eclipse vorschlägt, weil oft wird es unlesbar (wo ich das was die IDE bei dir gemacht hat, auch einstufen würde) und teilweise kompiliert es danach nicht mal. (@mihe7 würde das jetzt als normales Eclipse Verhalten bezeichnen :D)

Sprich, die IDEs sind zu dumm zu erkennen, was wirklich sinnvoll ist und wenden einfach stupide Patterns an, ohne das da ein tieferer Sinn im Einzelfall hintersteht.
 

mihe7

Top Contributor
@LimDul, da ist NetBeans auch cool drauf: wenn Du eine entsprechende for-Schleife hast, wird Dir die gelb unterringelt, weil Du sie ja als Stream schreiben könntest. Wenn Du das auf die Stream-Variante umschreiben hast lassen, wird Dir das gelb unterringelt, weil Du das ja als for-Schleife schreiben könntest. Da könnte so mancher jahrelang im Endlos-Refactoring gefangen sein :)
 

Neumi5694

Top Contributor
@LimDul, da ist NetBeans auch cool drauf: wenn Du eine entsprechende for-Schleife hast, wird Dir die gelb unterringelt, weil Du sie ja als Stream schreiben könntest. Wenn Du das auf die Stream-Variante umschreiben hast lassen, wird Dir das gelb unterringelt, weil Du das ja als for-Schleife schreiben könntest. Da könnte so mancher jahrelang im Endlos-Refactoring gefangen sein :)
Die Hinweise, was ich mit einem Stream machen könnte, zeigt er mir nur an, wenn ich das entsprechende Kommando markiere. DIe Empehlungen, dass man anstatt einer for each einen funktionalen Ausdruck verwenden könnte, werden immer angezeigt. Das lässt sich natürlich auch ausschalten.

Mir ging's nur darum, ob jemandem ein höherer Sinn bekannt ist, warum hier mapping verwendet wird (oder werden sollte?)
 
G

Gelöschtes Mitglied 65838

Gast
Bei Eclipse ignoriere ich fast alles, was mir Eclipse vorschlägt, weil oft wird es unlesbar (wo ich das was die IDE bei dir gemacht hat, auch einstufen würde) und teilweise kompiliert es danach nicht mal. (@mihe7 würde das jetzt als normales Eclipse Verhalten bezeichnen :D)
das kann man einstellen was dir eclipse als warnung oder error anzeigt zb warnings kannst du dir als errors anzeigen lassen
 

mihe7

Top Contributor
Ich stell da gar nix ein, das Ding hat zu funktionieren und fertig :cool:

Die Hinweise, was ich mit einem Stream machen könnte, zeigt er mir nur an, wenn ich das entsprechende Kommando markiere.
Das kannn auch sein, ich achte da nicht mehr drauf.

Mir ging's nur darum, ob jemandem ein höherer Sinn bekannt ist, warum hier mapping verwendet wird (oder werden sollte?)
Nö, ist einfach so, wie @LimDul geschrieben hat.
 

LimDul

Top Contributor
Das Praxis-Beispiel, warum aus Performance-Gründen die eine Variante nachhaltig besser ist als die andere, würde ich gerne mal sehen.

Für mich gilt da ganz klar Lesbarkeit vor Pseudo-Optimierungen.
 
G

Gelöschtes Mitglied 65838

Gast
in der Lambda expression wird wahrscheinlich in jeder Foreach die Übergebene funktion aufgerufen

bei einer normalen foreach hast du keinen externen funktions aufruf

deswegen denk ich dass die normale foreach es besser hinkriegen sollte... aber das ist ne plazebo optimierung... wer scheißt sich in java noch um "extra methodne aufrufe"
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
A Lambda-Ausdrücke Allgemeine Java-Themen 5
A Lambda und Streams verstehen Allgemeine Java-Themen 4
O Best Practice Lambda Expressions Allgemeine Java-Themen 3
Rudolf Compiler-Fehler Lambda als Argument kompiliert nicht Allgemeine Java-Themen 2
E Lambda filter performance Allgemeine Java-Themen 2
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
M Lambda "invalid method reference no suitable method found" Allgemeine Java-Themen 2
H Consumer (Java8 Lambda) an Timer übergeben Allgemeine Java-Themen 2
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
I Java Optionals mit return-Block Allgemeine Java-Themen 2
C try-catch Block Verständnisfrage Allgemeine Java-Themen 14
B Sudoku-Block-Prüfung Allgemeine Java-Themen 1
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
C Unendlich Wiederholungsfehler bei try catch - Block Allgemeine Java-Themen 3
T Warum ein privileg block? Allgemeine Java-Themen 0
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
N String aus Try/Catch-Block übernehen Allgemeine Java-Themen 14
B Execption auf Oberfläche werfen, try-catch-Block Allgemeine Java-Themen 6
G Initialization Block? Allgemeine Java-Themen 8
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
E JNA:Zugriff auf Common-Block von Fortran bzw. Struct in C Allgemeine Java-Themen 2
J synchronized block mit this und wait() Allgemeine Java-Themen 5
D break block by label Allgemeine Java-Themen 14
M Konstruktor / statischer Block Allgemeine Java-Themen 13
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
G GC Warning: Repeated allocation of very large block Allgemeine Java-Themen 35
E try/catch Block um ganzes Programm Allgemeine Java-Themen 10
conan2 static-Block in Klassen Allgemeine Java-Themen 6
H Ein synchronized Block ausreichend? Allgemeine Java-Themen 6
T rießiger try - catch - Block Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben