匿名内部类、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表达式的简写,借用其他类的方法体,省去了写方法体的过程。由于一些方法的参数只接收函数式接口的实现,所以不能直接通过方法调用代入,通过方法引用,赋予函数式接口的实现的方法体。

posted @ 2022-06-22 01:19  热心邻居老王  阅读(51)  评论(0编辑  收藏  举报