因为平台用的是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);
}
});