Lambda表达式里面修改外部变量问题
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
先看下Lambda表达式里面修改外部变量问题 因为平台用的是JDK8,而且发现自己对那些新特性好像一点都不了解,就例如Lambda表达式,所以就开始对自己的代码进行改进了。。。 例如遍历Map,像我们正常遍历肯定是下面这样子的。 String result = "select * from where id = '#userId#' and name = '#userName#'"; Map<String> sysParams = new HashMap<String>(); sysParams.put("#userId#", "userId"); 在Java 8中引入的Lambda表达式是一种简洁的匿名函数表示方式,它允许开发者以更紧凑的代码处理函数式编程任务。然而,在Lambda表达式中直接修改外部变量可能会导致编译错误,因为Java要求这些变量必须是final或effectively final。这里的"effectively final"指的是虽然变量没有被声明为final,但其值在初始化后从未改变过。 在描述的场景中,我们有一个用于SQL查询字符串的变量`result`,并且有一个Map `sysParams`来存储占位符和它们的替换值。传统的遍历Map并替换`result`中的占位符的方法如下: ```java String result = "select * from where id = '#userId#' and name = '#userName#'"; Map<String, String> sysParams = new HashMap<>(); // 添加键值对到sysParams... for (Map.Entry<String, String> entry : sysParams.entrySet()) { if (result.contains(entry.getKey())) { result = result.replaceAll(entry.getKey(), AppDataUtils.replaceSysData(entry.getValue())); } } ``` 当尝试使用Lambda表达式来实现同样的功能时,会出现如下错误: ```java sysParams.forEach((key, value) -> { if (result.contains(key)) { result = result.replaceAll(key, value); } }); ``` 由于`result`不是final或effectively final,这段代码无法通过编译。这是由于Java的Lambda表达式在内部创建了一个封闭的作用域,该作用域中的变量实际上是不可变的副本。为了解决这个问题,有几种方法可以考虑: 1. **使用局部变量的final副本**: 可以创建一个新的final变量,如`final String localResult = result;`,然后在Lambda表达式中操作`localResult`。 2. **使用数组或`AtomicReference`**: 如描述中所示,可以将`result`变量转换为数组,如`String[] arr = new String[]{result};`,然后在Lambda表达式中通过索引访问并修改数组元素。 3. **使用实例变量**: 将`result`声明为类的实例变量而非局部变量,这样Lambda表达式可以直接访问它,因为实例变量是在堆上分配的,不会因作用域结束而消失。不过,这可能会影响代码的封装性和可读性。 4. **使用方法引用**: 如果可能,可以将替换逻辑封装到一个方法中,然后使用方法引用,避免了Lambda表达式中直接修改变量的问题。 在实际开发中,选择哪种解决方案取决于具体的需求和代码的上下文。理解Lambda表达式的工作原理以及如何与外部变量交互,对于充分利用Java 8及更高版本的功能至关重要。
剩余6页未读,继续阅读
- 粉丝: 5
- 资源: 906
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HTML5实现好看的网络视频分享平台网站模板.zip
- HTML5实现好看的小清新电商家具商城模板.zip
- HTML5实现好看的物流运输公司网站模板.zip
- HTML5实现好看的舞蹈学院官网网站模板.zip
- HTML5实现好看的新闻资讯播报网站模板.zip
- HTML5实现好看的新闻杂志资讯网站模板.zip
- HTML5实现好看的新车销售平台网站模板.zip
- HTML5实现好看的牙齿护理医疗网站模板.zip
- HTML5实现好看的医疗科技公司网站模板.zip
- HTML5实现好看的眼睛护理医院网站模板.zip
- 基于单片机的指纹考勤机系统设计.zip
- 可以直接复制网页内容的工具
- 前端开发中的HTML和CSS圣诞树绘制方法
- 基于单片机的厨房安全检测系统.zip
- 车灯后罩冲压机工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- IMDB前250电视剧数据集,电视剧排行数据,电视剧数据集