Lambda表达式下访问外部变量问题

 更新时间:2023年11月20日 10:06:47   作者:勤快的小蚂蚁  
这篇文章主要介绍了Lambda表达式下访问外部变量问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Lambda表达式可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它外部的变量。

不过lambda表达式访问外部变量 有一个非常重要的限制

变量不可变(只是引用不可变,而不是真正的不可变) 遇到问题:

有同学反馈Stream循环处理集合时,可能需要操作一个中间变量进行复制或者比较操作。

做了一个简单的示例

如下:

(例子)统计取模2的数量

会提示(封闭范围中定义的局部变量a必须是final或effectively final):

当我们加入final进行变量修饰(无法分配最终的局部变量A):

原因

不过lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。

解决方案

java.util.concurrent.atomic.* AtomicInteger说明

AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。

AtomicReference说明:

它是通过"volatile"和"Unsafe提供的CAS函数实现"原子操作。

1.value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。

2. 通过CAS设置value。这保证了:当某线程池通过CAS函数(如compareAndSet函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。

扩展

a.incrementAndGet(); //前者,先+1,再返回
a.get()//获取当前a的值
a.getAndIncrement()//后者,先返回,再 +1

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis-Plus数据权限插件的简单使用

    MyBatis-Plus数据权限插件的简单使用

    在MyBatis-Plus中,通过DataPermissionInterceptor插件实现数据权限控制,首先需要创建自定义注解和处理类,利用JSQLParser库动态修改SQL,实现按角色权限过滤数据,配置类中注册拦截器,确保只有授权用户能访问指定数据,感兴趣的可以了解一下
    2024-10-10
  • Spring Boot 中的 @PutMapping 注解原理及使用小结

    Spring Boot 中的 @PutMapping 注解原理及使用小结

    在本文中,我们介绍了 Spring Boot 中的 @PutMapping 注解,它可以将 HTTP PUT 请求映射到指定的处理方法上,我们还介绍了 @PutMapping 注解的原理以及如何在 Spring Boot 中使用它,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • 详解IDEA JUnit5测试套件运行错误的问题

    详解IDEA JUnit5测试套件运行错误的问题

    这篇文章主要介绍了详解IDEA JUnit5测试套件运行错误的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java的接口调用时的权限验证功能的实现

    Java的接口调用时的权限验证功能的实现

    这篇文章主要介绍了Java的接口调用时的权限验证功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Maven多模块工程Module开发(图文教程)

    Maven多模块工程Module开发(图文教程)

    这篇文章主要介绍了Maven多模块工程Module开发(图文教程),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • java网络编程之群聊功能

    java网络编程之群聊功能

    这篇文章主要为大家详细介绍了java网络编程之群聊功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 解决SpringBoot使用yaml作为配置文件遇到的坑

    解决SpringBoot使用yaml作为配置文件遇到的坑

    这篇文章主要介绍了解决SpringBoot使用yaml作为配置文件遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java实战之实现文件资料上传并生成缩略图

    Java实战之实现文件资料上传并生成缩略图

    这篇文章主要介绍了通过Java实现文件资料的上传并生成一个缩略图,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12
  • Java中JDBC实现动态查询的实例详解

    Java中JDBC实现动态查询的实例详解

    从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询。下面通过实例代码给大家讲解JDBC实现动态查询的方法,需要的朋友参考下吧
    2017-07-07
  • 利用Java获取文件名、类名、方法名和行号的方法小结

    利用Java获取文件名、类名、方法名和行号的方法小结

    这篇文章运用实例代码给大家介绍了利用Java怎样获取文件名、类名、方法名和行号,有需要的可以参考借鉴,下面一起来看看吧。
    2016-08-08

最新评论