Referências do método Java 8 chamadas em uma variável local
Estou no processo de aprender Java 8 e me deparei com algo que acho um pouco estranho.
Considere o seguinte trecho:
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())
);
}
Basicamente, preciso mapear o conjunto de entrada chamadorelationships
para um tipo diferente para estar em conformidade com a API do DAO que estou usando. Para a conversão, eu gostaria de usar um existenteRelationshipTransformerImpl
classe que eu instanciao como uma variável local.
Agora, aqui está a minha pergunta:
Se eu fosse modificar o código acima da seguinte maneira:
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
}
Eu obviamente receberia um erro de compilação, já que a variável localtransformer
não é mais "efetivamente final". No entanto, se substituir o lambda por uma referência de método:
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
}
Então não recebo mais um erro de compilação! Por que isso acontece? Eu pensei que as duas maneiras de escrever a expressão lambda deveriam ser equivalentes, mas há claramente algo mais acontecendo.