Lambda 表达式
优点:
-
避免匿名内部类定义过多;
-
让代码看起来整洁;
-
去掉一堆无意义的代码,只留下核心的逻辑。
函数式接口定义:
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。通常与lambda表达式一起出现。
Public interface Runnable {
public abstract void run();
}
对于函数式接口,我们就可以通过lambda表达式来创建该接口的对象。
匿名内部类,没有类的名称,必须借助接口或父类
总结:
lambda表达式,在只有一行代码的情况下,才能简化为一行,如果是多行,必须使用代码块包装。
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。
jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。
多个参数可以去掉参数类型,要去掉都去掉,必须加上括号。
package lambdashow;
public class Lambda2 {
//静态内部类
static class Hello2 implements iHello{
public void hello(int a){
System.out.println("hello world" + a);
}
}
public static void main(String[] args) {
//常规调用
iHello i = new Hello();
i.hello(5);
//静态内部类调用
i = new Hello2();
i.hello(10);
//内部类调用
class Hello implements iHello {
@Override
public void hello(int a) {
System.out.println("hello world" + a);
}
}
i = new Hello();
i.hello(20);
//匿名内部类
i = new Hello() {
@Override
public void hello(int a) {
System.out.println("hello world" + a);
}
};
i.hello(25);
//lambda表达式
i = (int a) ->{
System.out.println("hello world" + a);
};
i.hello(30);
//lambda表达式,简化
i = a -> {
System.out.println("hello world" + a);
};
i.hello(520);
//lambda表达式,简化2
//可以去掉大括号的原因是这个函数只有一行代码
i = a -> System.out.println("hello world" + a);
i.hello(521);
}
}
interface iHello{
void hello(int a);
}
class Hello implements iHello {
@Override
public void hello(int a) {
System.out.println("hello world" + a);
}
}