java8新特性之lambda表达式(二)
2016-08-23 16:29
711 查看
lambda表达式中的变量:
需求1:新建一个方法,在方法中开一个线程,在线程中输出3个“helloWord”1.普通的写法:
public static void main(String[] args) { printHello("HelloWord",3); } -------------------------------------------- //参数底层使用的都加了final修饰 public static void printHello(String name,int count){ //在这里定义的变量,底层也是加了final修饰 String ch="!"; new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < count; i++) { //为什么内部类可以直接使用外部类额变量????? System.out.println(i+name+ch); } System.out.println(this);//打印内部类对象的地址,这个this代表是内部类的this,因为这个是静态方法,外部类对象不存在 } }).start(); } ------------------------------------------- 输出结果: 0HelloWord! 1HelloWord! 2HelloWord! 3HelloWord! 4HelloWord! lambada.TestLambda$1@2980e8cb //这个是内部类
2.反编译上面printHello()方法:
//参数底层使用的都加了final修饰 public static void printHello(final String name, final int count) { //在这里定义的变量,底层也是加了final修饰 final String ch = "!"; (new Thread(new Runnable() { private final int val$count; private final String val$name; private final String val$ch; public void run() { for (int i = 0; i < count; i++) System.out.println((new StringBuilder(String.valueOf(i))).append(name).append(ch).toString()); System.out.println(this); } { count = i; name = s; ch = s1; super(); } })).start(); }
反编译printHello()方法,可以知道:
1.printHello()的参数底层使用的都加了final修饰
2.在printHello()中定义的变量也加了final修饰
3.this是指向,内部类的this
2.lambda表达式的写法:
public static void main(String[] args) { new TestLambda().printHello("HelloWord",3); } --------------------------------------------- //参数的在底层被fianl修饰,所以可以在lambda表达式中可以直接使用该自由变量 public void printHello(String name,int count){ //在这里定义的局部变量,底层也是加了final修饰 String ch="!"; new Thread(()->{ for (int i = 0; i < count; i++) { System.out.println(i+name+ch); } System.out.println(this);//这个this不是内部类的this,而是外部类的this } ).start(); } ------------------------------------------- 输出结果: 0HelloWord! 1HelloWord! 2HelloWord! lambada.TestLambda@663a8ec8 //这个是外部类
从打印的结果可以知道:
1.printHello()的参数底层使用的都加了final修饰
2.在printHello()中定义的变量也加了final修饰
3.在lambda中的this是指向,创建lambda表达式的方法中的this,而不是内部类的this
lambda表达式中变量的3种类型:
1.参数//例如:表达式中的(User o1,User o2)参数 2.局部变量//例如:方法中定义的变量 3.自由变量(不是参数也不是局部变量)//例如:方法中的参数
总结:
结论: 1.lambda表达式中的自由变量会被保存,无论什么时候执行lambda表达式,都可以直接使用; 2.自由变量在lambda表达式中是不能修改的,因为自由变量是被final修饰 3.参数和局部变量的使用方式和普通的使用方式相同; 4.lambda表达式中的this指向,创建lambda表达式的方法中的this,而不是内部类的this
相关文章推荐
- Java 8新特性:lambda表达式
- Java 8新特性-3 Lambda 表达式
- Java8特性详解 lambda表达式 Stream
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
- Java8新特性之Lambda表达式
- Java 8新特性:lambda表达式(四)转载总结
- Android Studio使用gradle-retrolambda支持Java8 新特性 Lambde表达式
- JAVA 新特性:lambda表达式
- java8新特性之lambda表达式(一)
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
- java8新增特性(一)---Lambda表达式
- Java8 新特性----函数式接口,以及和Lambda表达式的关系
- Java 8 新特性:Lambda 表达式
- Java8 新特性之 Lambda 表达式
- Java8新特性——lambda表达式
- Java8新特性 - Lambda表达式 - 基本知识
- JAVA 1.8 新特性学习(2) lambda表达式
- Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)
- java8新特性学习笔记(一) Lambda表达式
- Java8 新特性之一---------Lambda表达式和函数式接口