调用局部变量 java_Java 8方法引用调用局部变量

我正在学习Java 8,我遇到了一些我觉得有点奇怪的事情 .

请考虑以下代码段:

private MyDaoClass myDao;

public void storeRelationships(Set> 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> 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 不再是"effectively final" . 但是,如果用方法引用替换lambda:

public void storeRelationships(Set> 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表达式的两种方法应该是等价的,但显然还有更多的事情要发生 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值