lambda表达式:变量作用域
2015-12-09 09:56
218 查看
如下代码中的变量count和text,没有在lambda表达式中被定义,而是repeatMessage方法的参数变量
一个lambda表达式包括三部分:
1.一段代码。
2.参数。
3.只有变量的值。(“自由”指的是那些不是参数并且没有在代码中定义的变量)
在lambda表达式中,被引用的变量的值不可以被更改,如下代码:
内部类也会捕获闭合作用域中的值。在Java8前,内部类只允许访问final的局部变量。为了适应lambda表达式,这条规则现在放宽了。一个内部类可以访问任何有效的final局部变量,即任何值不会发生变化的变量。
在lambda表达式中不允许声明一个与局部变量同名的参数或者局部变量,如下代码:
lambda表达式中的this关键字的意义,如下代码:
public void repeatMessage(String text, int count){ Runnable r = () -> { for (int i=0; i<count; i++){ System.out.println(text); Thread.yield(); } }; new Thread(r).start(); }
一个lambda表达式包括三部分:
1.一段代码。
2.参数。
3.只有变量的值。(“自由”指的是那些不是参数并且没有在代码中定义的变量)
在lambda表达式中,被引用的变量的值不可以被更改,如下代码:
public void repeatMessage(String text, int count){ Runnable r = () -> { while (count > 0){ count --; //错误,不能更改 System.out.println(text); Thread.yield(); }; }; new Thread(r).start(); }原因:更改lambda表达式中的变量不是线程安全的,自增、自减操作不是原子性的。
内部类也会捕获闭合作用域中的值。在Java8前,内部类只允许访问final的局部变量。为了适应lambda表达式,这条规则现在放宽了。一个内部类可以访问任何有效的final局部变量,即任何值不会发生变化的变量。
在lambda表达式中不允许声明一个与局部变量同名的参数或者局部变量,如下代码:
Path first = Paths.get("/usr/bin"); Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //错误:变量first已经被定义了
lambda表达式中的this关键字的意义,如下代码:
class Application { public void doWork(){ Runnable runner = () -> { System.out.println(this.toString()); }; } }this.toString()会调用Application对象的toString方法,而不是Runnable实例的toString方法。
相关文章推荐
- socket选项表
- centos CDH 离线安装步骤
- ORA-12638: 身份证明检索失败 的解决办法
- 一个非常赞的网页背景效果——canvas-nest
- spring为ApplicationContext提供有三种实现
- spark通过jdbc访问postgresql数据库
- js Function function
- UIWebView使用简介
- SQL Server查询系统建议的索引信息
- C# 封装,继承,多态
- 二十7天 春雨滋润着无形 —Spring依赖注入
- 表单提交验证
- NHibernate 之持久化类、拦截器 (第二篇)
- NHibernate之一级缓存(第十篇)
- 夺命雷公狗---javascript NO:16 默认行为1
- ImageView的src和background的区别
- UVa 11548 例题9-7划分回文串
- Spring MVC+Hibernate框架项目开发流程
- 解决“org.apache.hadoop.security.AccessControlException”
- DecimalFormat(数字格式化) SimpleDateFormat(时间格式化)