首先我们要知道方法引用是用来干什么的?
它是用来简化Lambda表达式,因此前提就是你简化的是Lambda表达式。不知道Lambda表达式怎么写的话可以转步的另一篇文章:Lambda表达式的详细介绍
格式: 类型或对象::方法
1.实例方法的引用
注意:被引用的方法的参数列表要和函数式接口的抽象方法的参数列表保持一致
我们直接看一段代码
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
//使用Lambda表达式进行遍历:
//此处若看不懂移步我的上一篇文章
list.forEach(s ->System.out.println(s));
//方法引用继续进行简写
//注意:此时的s刚好是方法的参数列表的参数,因此可以进行简化
list.forEach(System.out::println);
//此时的System.out其实是作为一个对象存在的,就是输出流的一个对象
2.静态方法的引用
格式:类名::静态方法
被引用的方法列表的参数列表的函数式接口的参数列表保持一致
List<Student> lis = new ArrayList<>();
lis.add(new Student("huahi"));
lis.add(new Student("hu"));
lis.add(new Student("hua"));
lis.add(new Student("huah"));
lis.add(new Student("h"));
//Lambda表达式简化,表示按照姓名长度进行排序
Collections.sort(lis ,(o1,o2) ->o1.getName().length() - o2.getName().length());
//静态方法进行简化:
Collections.sort(lis ,(o1,o2) -> Student.Mcompare(o1, o2));
//继续简化:终极目标
Collections.sort(lis ,Student::Mcompare);
//此时前边的o1,o2要和后边的参数列表保持一致
-----------Student类要定义静态方法--------------------
class Student implements Comparator<Student>{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(String name) {
super();
this.name = name;
}
public Student() {}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
//定义静态方法
public static int Mcompare(Student o1, Student o2) {
return o1.getName().length() - o2.getName().length();
}
@Override
public int compare(Student o1, Student o2) {
return o1.getName().length() - o2.getName().length();
}
}
特定类型方法的引用
格式: 特定类型::方法
需求:排序字符串按照字符排序,不区分大小写
List<String> lis = new ArrayList<>();
lis.add("ahuahi");
lis.add("Ahu");
lis.add("bhua");
lis.add("Bhuah");
lis.add("a");
Collections.sort(lis);
System.out.println(lis);
//打印结果:[Ahu, Bhuah, a, ahuahi, bhua] 不符合要求
//自定义比较器
//Lambda表达式写法
Collections.sort(lis,(String o1, String o2) -> o1.compareToIgnoreCase(o2));
//简化:
Collections.sort(lis,String::compareToIgnoreCase);