1.Lambda表达式与接口之间的关系
只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口。见如下代码
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("hi");
}
});
t1.start();
Thread t2 = new Thread(() -> System.out.println("hi"));
t2.start();
t1与t2完成相同的功能。t2中的Lambda表达式() -> System.out.println("hi")
与Runnable
接口中的方法public abstract void run();
的形式一样:
- 没有返回值。
- 没有传入参数。
下面一个例子中
String[] arr = {"111","22","3"};
Arrays.sort(arr,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
Arrays.sort(arr, (o1,o2)->o1.length()-o2.length());
(o1,o2)->o1.length()-o2.length()
的形式与Compartor中public int compare(String o1, String o2)
形式也一样:
- 两个入参。
- 一个返回值,且返回值为int类型。
2.Lambda表达式、匿名内部类与this
Lambda表达式在用法上看起来很像匿名内部类,但其并不是匿名内部类。比如,在以下代码中,在Lambda表达式中不能获得this。
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println(this);//打印匿名内部类
}
});
t1.start();
Thread t2 = new Thread(()->{
//System.out.println(this);//无法编译通过
});
t2.start();
观察如下代码,会发现Lambda表达式中的this与所处环境有关,在这里this是对外部对象的引用。
class Foo{
Runnable r1 = ()->{
System.out.println(this);
};
Runnable r2 = ()->{
System.out.println(this);
};
void test(){
r1.run();
r2.run();
}
}
//测试代码如下
Foo foo = new Foo();
System.out.println(foo);
foo.test();
从输出可以看出,输出了三个对象实际上是同一个对象。
Foo@87aac27
Foo@87aac27
Foo@87aac27