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.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage