网站后台管理入口,免费商城自助建站,大安市建设局网站,wordpress redis手机博主简介#xff1a;想进大厂的打工人博主主页#xff1a;xyk:所属专栏: JavaEE进阶 目录
一、Lambda表达式语法 二、Lambda中变量捕获 一、Lambda表达式语法
基本语法: (parameters) - expression 或 (parameters) -{ statements; }
Lambda表达式由三部分组成想进大厂的打工人博主主页xyk:所属专栏: JavaEE进阶 目录
一、Lambda表达式语法 二、Lambda中变量捕获 一、Lambda表达式语法
基本语法: (parameters) - expression 或 (parameters) -{ statements; }
Lambda表达式由三部分组成
paramaters类似方法中的形参列表这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。 -可理解为“被用于”的意思 方法体可以是表达式也可以代码块是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回这里的代码块块等同于方法的方法体。如果是表达式也可以返回一个值或者什么都不反回。
二、Lambda中变量捕获
Java中不通过Lambda函数入参传入的参数我们称为函数的自由变量在Lambda函数中使用自由变量的动作叫捕获。
Lambda函数捕获的自由变量必须是逻辑不变的不可变或事实上无逻辑修改通常用final修饰通常理解为final修饰的变量或者实际final没有被final修饰但是使用前没有被修改理解和被final修饰的变量是一样的
Lambda函数只能捕获自由变量一次这个变量的值在多线程中为了防止发生线程安全问题通常要把它设置为final或者实际final例如 可见在变量捕获之前没有进行任何修改并且在多线程中不会发生线程安全问题因为每次访问的都是同一个isQuit那么如果改成方法内的局部变量会是什么样如下 可见也是可以正常运行的那么如果修改变量还能成功吗请看 如图修改了变量就不是实际final的变量了因此lambda不能正确捕获。
那么如果我修改上面的静态成员变量还可以捕获吗如图 答案是可以的是没有报错的这是因为如果多线程访问都只是同一个isQuit变量不会出现第二个isQuit变量因为静态成员变量是分配在堆上的堆上的数据是共享的所以不会发生堆上变量在Lambda函数访问其之前被回收的问题
但是如果是局部变量多线程访问就会出现问题因为变量在一个线程中被修改了和其他线程的捕获结果也就不同了~~局部变量是在栈上分配的可能会发生局部变量的分配逻辑和Lambda函数不在同一个线程的情况若分配逻辑已经执行完其栈上的变量将被回收此时Lambda函数再去访问势必会出错。