Supponiamo che voglia eseguire un'iterazione su una raccolta di oggetti.Differenze di implementazione/ottimizzazioni tra espressioni Lambda e classi anonime
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");
Come funziona il secondo esempio (senza lambda)? Un nuovo oggetto (Predicate e Consumer) creato ogni volta che chiamo il codice, quanto può il compilatore java jit ottimizzare l'espressione lambda? Per una performance migliore dovrei dichiarare tutti i lambda come una variabile e sempre solo passare un riferimento?
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);
Vedere [here] (http://stackoverflow.com/q/27524445/2711488). E [questo] (http://stackoverflow.com/a/23991339/2711488) si applica anche alle espressioni lambda e ai riferimenti al metodo. HotSpot può ottimizzare le istanze temporanee delle classi interne, ma per le espressioni lambda stateless non ci sono istanze temporanee in primo luogo. – Holger
@Holger - belle risposte – ZhongYu