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