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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot和Vue的后台管理系统.zip
- 用于将 Power BI 嵌入到您的应用中的 JavaScript 库 查看文档网站和 Wiki 了解更多信息 .zip
- (源码)基于Arduino、Python和Web技术的太阳能监控数据管理系统.zip
- (源码)基于Arduino的CAN总线传感器与执行器通信系统.zip
- (源码)基于C++的智能电力系统通信协议实现.zip
- 用于 Java 的 JSON-RPC.zip
- 用 JavaScript 重新实现计算机科学.zip
- (源码)基于PythonOpenCVYOLOv5DeepSort的猕猴桃自动计数系统.zip
- 用 JavaScript 编写的贪吃蛇游戏 .zip
- (源码)基于ASP.NET Core的美术课程管理系统.zip