你问的问题在 Project Lambda 的概述文档上已经解释了,这都属于设计上的取舍。

不能改变外部变量的值是因为线程安全问题。当然这可能不是唯一原因,可能有其他考虑,但文档上清清楚楚说明了:While we relax the syntactic restrictions on captured values, we still prohibit capture of mutable local variables. The reason is that idioms like this:

int sum = 0;

list.forEach(e -> { sum += e.size(); }); // ERROR

are fundamentally serial; it is quite difficult to write lambda bodies like this that do not have race conditions. Unless we are willing to enforce -- preferably at compile time -- that such a function cannot escape its capturing thread, this feature may well cause more trouble than it solves. Lambda expressions close over values, not variables.

当然你可以通过一个包装类,或者一个大小为 1 的数组轻松绕过这个限制,但是在这时就应该由你自己保证线程的安全问题。

不能遮蔽变量也有说明:Lambda expressions are much simpler: they do not inherit any names from a supertype, nor do they introduce a new level of scoping. Instead, they are lexically scoped, meaning names in the body are interpreted just as they are in the enclosing environment (with the addition of new names for the lambda expression's formal parameters). As a natural extension, thethiskeyword and references to its members have the same meaning as they would immediately outside the lambda expression.

Consistent with the lexical-scoping approach, and following the pattern set by other local parameterized constructs likeforloops andcatchclauses, the parameters of a lambda expression must not shadow any local variables in the enclosing context.

这里说的很清楚了,为了保持简单性,词法范围内 lambda 和块的是一样的,不允许对局部变量进行遮蔽。

java lambda 变量_为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?...相关推荐

  1. 在form2中调用form1中的方法并改变form1中控件值的另一种方法

    在窗体编程中,经常碰到到要在form2中调用form1中的方法并改变form1中控件值,但是又不能用new form1这种方法,因为这是生成一个实例. 网上有些说法是用委托和事件,笔者尝试没有成功,可 ...

  2. java lambda循环_在Java 8 Lambda中创建自己的循环结构

    java lambda循环 Java没有简单的结构可以重复N次. 当然,我们可以创建一个for循环,但是很多时候我们甚至都不关心在循环中创建的变量. 我们只想重复一些代码N次,仅此而已. 使用Java ...

  3. java 复合方法_《Java 8 实战》Ch3: Lambda表达式(下):类型与限制、方法引用、复合...

    李文轩 2019-04-23 3.5 类型的检查和判断:变量捕获限制 类型检查 Lambda的类型是从使用Lambda的上下文推断出来的. Lambda表达式需要的类型称为目标类型 . Lambda表 ...

  4. java lambda 反射_反射调用与Lambda表达式调用

    想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用--至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验 ...

  5. 不属于JAVA类中的变量_在Java中,不属于整数类型变量的是( )。_学小易找答案...

    [单选题]整型数据类型中,需要内存空间最少的是( ). [单选题]下列语句序列执行后,i的值是( ). int i=16; do { i/=2; } while( i > 3 ); [填空题]布 ...

  6. java输出啊abc变量_在Java中变量ABc和变量abc是同一个变量。

    [判断题]nextInt()方法可以用来获取键盘输入的各种类型数据. [单选题]194 . 理想运放电路如图所示,VD为发光二极管.当光照时,流过发光二极管的电流=10μA,则此时输出电压为 [单选题 ...

  7. java string hash变量_聊聊 Java 中 HashMap 初始化的另一种方式

    如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的"臃肿.啰嗦"的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型.复杂项目的理由之一 ...

  8. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  9. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

最新文章

  1. HDU Problem - 5101 Select(二分)
  2. PayPal 开发详解(六):下载paypal立即付款SDK 并编译打包
  3. mysql 取年月日 语句_MySQL学习从这里出发!
  4. MySQL的基本语法(授权与备份)
  5. 时间序列深度学习:状态 LSTM 模型预测太阳黑子(上)
  6. 图形变换之旋转变换公式推导
  7. [Pytorch系列-35]:卷积神经网络 - 搭建LeNet-5网络与CFAR10分类数据集
  8. win10怎么修改DNS
  9. vue 手写签名_与众不同的手写签批
  10. 什么是生态型平台企业?
  11. 学 android需要什么基础,学习安卓开发需要什么基础?
  12. _032_rationalRose_包图的画法
  13. 服务器(2080Ti)配置pytorch,distiller开发环境踩坑记录
  14. linux中可以使用以下命令查看文件内容,在Linux服务器中使用命令行中查看文件内容...
  15. java对接杉德支付完整代码
  16. 管理系统页面布局 html,二十五个精美的后台管理界面模板和布局
  17. 2 评价类算法:TOPSIS法笔记(附Python代码)
  18. 【硬件基础】--------电容
  19. 安卓个人中心头像模块(从相册选择和照相功能,适配7.0)
  20. Java多线程学习记录

热门文章

  1. python string/list转换
  2. Android 哥哥福利
  3. [iOS] 在UIToolBar中增加UILabel等控件(xib/storyboard图形界面方式)
  4. 详解基于CentOS6.2下DNS主从复制搭建与部署
  5. 【hibernate系列】采用p6spy+SQLProfiler完整显示hibernate的S...
  6. python中time模块常用功能
  7. 超详细的java生成excel文件并下载
  8. Java集合总结【面试题+脑图】,将知识点一网打尽!
  9. 微信JS SDK Demo
  10. 2017-9-11-颜色空间