Java Lambda表达式
1.Lambda是java8的新特性,lambda表达式也称为闭包,是在匿名内部类的基础上衍生出来的
2.Lambda表达式优点:避免了匿名内部类定义过多,减少了代码量
3.Lambda表达式的关键是函数式接口
函数式接口:任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口,如:
public interface Runnable{
public abstract void run();
}
4.Lambda表达式的推演(代码按这些类的顺序看,都注解了):普通内部类(1)-->静态内部内(2)-->局部内部类(3)-->匿名内部类(4)-->Lambda表达式()(5)(使用这些类时注意放的位置)
package cn.lexed.Demo3;
public class LambdaTest {
//静态内部类
static class People1 implements Note{
public void say() {
System.out.println("I love you world");
}
}
public static void main(String[] args){
//接口实例化一个对象,向上转型
Note note=new People();
note.say();
note=new People1();
note.say();
//局部内部类
class People2 implements Note{
public void say() {
System.out.println("I love you and world");
}
}
note=new People2();
note.say();
//匿名内部类,没有类的名称,必须借助接口或者父类
note=new Note(){
public void say(){
System.out.println("心中无物");
}
};
note.say();
//lambda简化
note=()->{
System.out.println("心中无物");
};
note.say();
}
}
//普通内部类
class People implements Note{
String name="未知";
public void say(){
System.out.println("I love you"+name);
}
}
interface Note{
void say();
}
Lambda的化简
1.无参数,无返回值
语法:
note=()->{
System.out.println("心中无物");
};
note.say();
2.当接口里方法只有一个参数,无返回值时:参数类型和括号可以省略
语法:
Animal dog=name->{
System.out.println("我的名字是"+name+",我是这个家的看守者");
};
dog.type("dog");
interface Animal{
void type(String name);
}
3.两个参数,无返回值:参数类型可以省略
语法:
Animal dog=(name,age)->{
System.out.println("我的名字是"+name+"我"+age+"岁了,我是这个家的看守者");
};
dog.type("dog",12);
interface Animal{
void type(String name,int age);
}
总结:
1.Lambda表达式只能有一行代码的情况下才能简化成为一行,如果多行用代码块包裹
2.前提是接口为函数式接口
3.多个参数也可以去掉参数类型,括号不可以去掉
<!--大家可以尝试下写两个参数有返回值的Lambda表达式-->