Java 8 Methodenreferenzen, die für eine lokale Variable aufgerufen werden
Ich bin gerade dabei, Java 8 zu lernen, und bin auf etwas gestoßen, das mir ein bisschen komisch vorkommt.
Betrachten Sie das folgende Snippet:
private MyDaoClass myDao;
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map((input) -> transformer.transformRelationship(input))
.collect(Collectors.toSet())
);
}
rundsätzlich muss ich die Eingabemenge mit dem Namen @ zuordnerelationships
auf einen anderen Typ, um der API des von mir verwendeten DAO zu entsprechen. Für die Konvertierung möchte ich ein vorhandenes @ verwendRelationshipTransformerImpl
Klasse, die ich als lokale Variable instanziiere.
Now, hier ist meine Frage:
Wenn ich den obigen Code wie folgt ändern sollte:
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map((input) -> transformer.transformRelationship(input))
.collect(Collectors.toSet())
);
transformer = null; //setting the value of an effectively final variable
}
Ich würde natürlich einen Kompilierungsfehler bekommen, da die lokale Variabletransformer
ist nicht mehr "effektiv final". Ersetzen Sie jedoch das Lambda durch einen Methodenverweis:
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map(transformer::transformRelationship)
.collect(Collectors.toSet())
);
transformer = null; //setting the value of an effectively final variable
}
Dann bekomme ich keinen Übersetzungsfehler mehr! Warum passiert das? Ich dachte, die beiden Möglichkeiten, den Lambda-Ausdruck zu schreiben, wären gleichwertig, aber da ist eindeutig etwas mehr los.