方法引用概述
目的
方法引用是为了进一步简化Lambda表达式的写法
格式
代码语言:javascript复制类型或对象::引用的方法 //关键语法 “::”
实例
代码语言:javascript复制package ComparatorDemo;
import java.util.ArrayList;
import java.util.List;
public class MethodDemo {
public static void main(String[] args) {
List<String> lists=new ArrayList<>();
lists.add("first");
lists.add("second");
lists.add("third");
//遍历列表,通过Lambda表达式的方法
lists.forEach(s -> System.out.println(s));
//方法引用(前提:必须形如上式前后的参数一致)
lists.forEach(System.out::println);
}
}
静态方法的引用
格式
代码语言:javascript复制类名::静态方法
简化步骤
定义一个静态方法,将需要简化的代码放到一个静态方法中去
注意事项
- 被引用的方法的参数列表和函数式接口中的抽象方法的参数列表必须完全一致
- 如果函数式接口中的抽象方法有返回值,则被应用的方法也必须有相同返回值
- 如果函数式接口中的抽象方法没有返回值,则被应用的方法也可以有返回值,也可以没有
实例
首先在Student类中重写一个静态方法
代码语言:javascript复制//首先定义静态方法
public static int compareByAge(Student s1,Student s2){
return s1.getAge()-s2.getAge();
}
然后利用静态方法的引用简化代码
代码语言:javascript复制package ComparatorDemo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparatorDemo1 {
public static void main(String[] args) {
List<Student> lists=new ArrayList<>();
Student s1=new Student("Leslie",18,"Man");
Student s2=new Student("John",14,"Man");
Student s3=new Student("Gym",20,"Woman");
//批量向数组插入数据
Collections.addAll(lists,s1,s2,s3);
//按照年龄进行排序(匿名内部类做法)
Collections.sort(lists, (t1,t2)->Student.compareByAge(t1,t2));
//使用静态方法进行简化,前后参数必须相同
Collections.sort(lists,Student::compareByAge);
for(Student stu:lists) {
System.out.printf("name=%s age=%d sex=%sn",stu.getName(),stu.getAge(),stu.getSex());
}
}
}
实例方法引用
格式
代码语言:javascript复制对象::实例方法
步骤
定义一个实力方法,把需要的代码放到实例中去
注意事项
被引用方法的参数列表和函数式接口的抽象方法的参数列表必须完全一致
实例
实例就是本节开头所引的System.out.println的简化写法
println本身是实例方法,out是输出流对象,并且前后参数完全一致,所以可以用方法引用简化
构造器引用
格式
代码语言:javascript复制类名::new
注意
前后两个参数一致并且在创建对象的情况下就可以使用构造器引用
代码语言:javascript复制//前后参数一致,并在创建对象
s -> new Student(s);
//改写成引用
Student::new