关于Lambda表达式里面修改外部变量问题

        因为平台用的是JDK8,而且发现自己对那些新特性好像一点都不了解,就例如Lambda表达式,所以就开始对自己的代码进行改进了。。。

        例如遍历Map,像我们正常遍历肯定是下面这样子的。

String result = "select * from where id = '#userId#' and name = '#userName#'";
Map<String,String> sysParams = new HashMap<String,String>();
sysParams.put("#userId#", "userId");
sysParams.put("#userName#", "userName");
sysParams.put("#realName#", "realName");
sysParams.put("#orgIds#", "orgIds");
sysParams.put("#departname#", "departname");
sysParams.put("#roleId#", "roleId");

for(Map.Entry<String, String> entry : sysParams.entrySet()){
	if(result .contains(entry.getKey())){
		result = result .replaceAll(entry.getKey(), AppDataUtils.replaceSysData(entry.getValue()));
	}
}

但是如果用Lambda表达式呢,将会非常的简单,

但是我们会发现,result那里是会报错的:Local variable result defined in an enclosing scope must be final or effectively final

String result = "select * from where id = '#userId#' and name = '#userName#'";
Map<String,String> sysParams = new HashMap<String,String>();
sysParams.put("#userId#", "userId");
sysParams.put("#userName#", "userName");
sysParams.put("#realName#", "realName");
sysParams.put("#orgIds#", "orgIds");
sysParams.put("#departname#", "departname");
sysParams.put("#roleId#", "roleId");
		
sysParams.forEach((key,value)->{
	if(result.contains(key)){
		result  = result.replaceAll(key, value);
				
	}
});

这是因为:Java会将result的值作为参数传递给Lambda表达式,为Lambda表达式建立一个副本,它的代码访问的是这个副本,而不是外部声明result变量。可能很多同学会问为什么非要建立副本呢,直接访问外部的result变量得多方便呢。答案是:这是不可能滴,因为result定义在栈中,当Lambda表达式被执行的时候,result可能已经被释放掉了。

当然啦,你要是一定要在Lambda表达式里面修改外部变量的值也是可以的,可以将变量定义为实例变量或者将变量定义为数组。

下面我就改为数组咯,实例变量不方便。

	String result = "select * from where id = '#userId#' and name = '#userName#'";
	//将变量定义为数组就好了
    String[] arr = new String[]{result};
	Map<String,String> sysParams = new HashMap<String,String>();
	sysParams.put("#userId#", "userId");
	sysParams.put("#userName#", "userName");
	sysParams.put("#realName#", "realName");
	sysParams.put("#orgIds#", "orgIds");
	sysParams.put("#departname#", "departname");
	sysParams.put("#roleId#", "roleId");
		
	sysParams.forEach((key,value)->{
		if(arr[0].contains(key)){
            //都是对数组进行操作了
			arr[0]  = arr[0].replaceAll(key, value);
				
		}
	});

 

  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值