您的位置:首页 > 编程语言 > Java开发

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 lambda java8新特性