Nehmen wir an, ich möchte über eine Sammlung von Objekten iterieren.Implementierungsunterschiede/Optimierungen zwischen Lambda Expressions und anonymen Klassen
List<String> strmap = ...
//Without lambdas
strmap.stream().filter(new Predicate<String>() {
public boolean test(String string) {
return string.length == 10;
}
}.forEach(new Consumer<String>() {
public void accept (String string) {
System.out.println("string " + string + " contains exactly 10 characters");
}
}
//With lambdas
strmap.stream()
.filter(s -> s.length == 10)
.forEach(s -> System.out.println("string " + s + " contains exactly 10 characters");
Wie funktioniert das zweite Beispiel (ohne lambdas)? Ein neues Objekt (Predicate und Consumer) wird jedes Mal erstellt, wenn ich den Code aufruft. Wie viel kann der Java Jit Compiler einen Lambda-Ausdruck optimieren? Für eine bessere Leistung sollte ich alle Lambdas als Variable deklarieren und immer nur eine Referenz übergeben?
private Predicate<String> length10 = s -> s.length == 10;
private Consumer<String> printer = s -> { "string " + s + " contains exactly 10 characters"; }
strmap.stream()
.filter(length10)
.forEach(printer);
Siehe [hier] (http://stackoverflow.com/q/27524445/2711488). Und [dies] (http://stackoverflow.com/a/23991339/2711488) gilt auch für Lambda-Ausdrücke sowie Methodenreferenzen. HotSpot kann die temporären Instanzen von inneren Klassen optimieren, aber für statusfreie Lambda-Ausdrücke gibt es zunächst keine temporären Instanzen. – Holger
@Holger - nette Antworten – ZhongYu