Nieuwe objectinstantiatie bij gebruik van Java 8-streams

Is er een verschil in het gebruik van de volgende constructies, behalve dat de laatste iets beter leesbaar is?

someList.stream().map(item -> new NewClass(item)).collect(Collectors.toList());
someList.stream().map(NewClass::new).collect(Collectors.toList());

Antwoord 1, autoriteit 100%

Over het algemeen is er geen verschil. NewClass::newproduceert minder bytecode, aangezien in de lambda-versie een automatisch gegenereerde privémethode wordt gemaakt door de Java-compiler uit de lambda-body, terwijl NewClass:newrechtstreeks linkt naar de constructormethode omgaan met. Dus als u methodeverwijzingen gebruikt, heeft u mogelijk iets minder klassenbestandsgrootte. Er wordt echter geen significant prestatieverschil verwacht.

Een ander verschil is de procedure voor het oplossen van de methode. Het is niet van toepassing in uw specifieke voorbeeld, maar kan van toepassing zijn in andere code. U hebt bijvoorbeeld twee constructors:

public NewClass(String a) {...}
public NewClass(String a, String b) {...}

En je hebt een methode die een functionele interface accepteert:

public myMethod(Function<String, NewClass> fn) {...}

Dan kun je het zowel met lambda als met functionele interface noemen:

myMethod(str -> new NewClass(str));
myMethod(NewClass::new);

Maar stel dat je later een nieuwe methode toevoegt met dezelfde naam, zoals deze:

public myMethod(BiFunction<String, String, NewClass> fn) {...}

De aanroep van de methodereferentie wordt dan dubbelzinnig en resulteert in een compilatiefout omdat NewClass::newnu overeenkomt met beide constructors, terwijl lambda nog steeds ondubbelzinnig is.

Other episodes