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.
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.