Java 8 ссылки на методы, вызываемые для локальной переменной
Я нахожусь в процессе изучения Java 8, и я столкнулся с чем-то странным.
Рассмотрим следующий фрагмент:
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())
);
}
В основном мне нужно отобразить входной набор с именемrelationships
к другому типу, чтобы соответствовать API DAO, который я использую. Для преобразования я хотел бы использовать существующийRelationshipTransformerImpl
класс, который я создаю как локальную переменную.
Теперь вот мой вопрос:
Если бы я должен был изменить вышеуказанный код следующим образом:
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
}
Я бы, очевидно, получил ошибку компиляции, так как локальная переменнаяtransformer
больше не "эффективно окончательный". Однако, если заменить лямбду ссылкой на метод:
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
}
Тогда я больше не получаю ошибку компиляции! Почему это происходит? Я думал, что два способа написания лямбда-выражения должны быть эквивалентны, но явно происходит нечто большее.