【发布时间】:2015-03-01 02:48:11
【问题描述】:
我正在学习 Java 8,遇到了一些我觉得有点奇怪的东西。
考虑以下 sn-p:
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 的输入集映射到不同的类型,以便
符合我正在使用的 DAO 的 API。对于转换,我想使用现有的 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 不再是“有效的最终”。但是,如果将 lambda 替换为方法引用:
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
}
然后我不再收到编译错误!为什么会这样?我认为编写 lambda 表达式的两种方法应该是等价的,但显然还有更多事情要做。
【问题讨论】:
标签: java lambda java-8 method-reference