Я нахожусь в процессе изучения 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
}
Тогда я больше не получаю ошибку компиляции! Почему это происходит? Я думал, что два способа написания лямбда-выражения должны быть эквивалентны, но там явно происходит нечто большее.