匿名内部类、Lambda表达式、方法引用之个人理解
匿名内部类,没有名字,一般是某个类的子类或接口的实现类。
格式:
父类/接口 对象名 = new 父类/接口(){
//方法重写
...
}
Lambda表达式是匿名内部类的简写,且限定该匿名内部类为函数式接口的实现。
只关注参数列表、返回类型和方法体,忽略方法名等无关紧要的因素。
函数式接口,接口中允许有默认方法、静态方法,但有仅只有一个抽象方法
格式:
()->{}
//单参时忽略(),如a->{}
//方法体只有一句,可以忽略{},如a->System.out.println(a);
//方法体只有return一句,可以省return、{},如a->2a
方法引用,当函数式接口的抽象方法与某个类的某个方法 的参数列表、返回类型一致,则可以用Lambda表达式借用这个类的这个方法的方法体
格式:
方法引用与方法的调用有异曲同工之妙,见如下
//1.静态方法的引用
public interface Test{
public void run(String s);
}
public class Test1{
public static void say(String hello){
System.out.println(hello);
}
}
//调用
Test1.say("Hi");//控制台输出:Hi
//引用
Test t = Test1::say;
t.run("Hi");//控制台输出:Hi
//2.实例方法的引用
public interface Test{
public void run(String s);
}
public class Test1{
public void say(String hello){
System.out.println(hello);
}
}
//调用
Test1 t1 = new Test1();
t1.say("Hi");//控制台输出:Hi
//引用
Test1 t1 = new Test1();
Test t = t1::say;
t.run("Hi");//控制台输出:Hi
//3.构造方法的引用
public interface Test{
public Student run(String s,int age);
}
public class Student{
private String name;
private int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
public Student(){
}
}
//调用
Student tom = new Student("tom",12);
//引用
Student tom = = Student::new;
从某种意义上讲,方法引用是Lambda表达式的简写,借用其他类的方法体,省去了写方法体的过程。由于一些方法的参数只接收函数式接口的实现,所以不能直接通过方法调用代入,通过方法引用,赋予函数式接口的实现的方法体。