1.概述
方法引用(Method Reference)是lambda表达式的一种特殊形式,如果正好有某个方法满足一个lambda表达式的形式,那就可以将这个lambda表达式用方法引用的方式表示,但是如果这个lambda表达式的比较复杂就不能用方法引用进行替换。实际上方法引用是lambda表达式的一种语法糖。
方法引用通过方法的名字来指向一个方法。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 :: 。
方法引用共分为四类:
1.类名::静态方法名
2.对象::实例方法名
3.类名::实例方法名
4.类名::new
入门案例:
public class MethodReferenceTest { static void printStr(Consumer<String> c, String s) { // 借助Consumer接口,accept方法可以接收参数 c.accept(s); } public static void main(String[] args) { printStr(s -> System.out.println(s), "Lambda写法"); // 使用方法引用的前提: // |--对象已经存在(System.out) // |--方法也存在(println()) // |--参数是方法可接收类型(String) printStr(System.out::println, "方法引用:连参数都不写"); } }
控制台输出:
Lambda写法
方法引用:连参数都不写
2.引用静态方法
Person实体类
@Data @AllArgsConstructor @NoArgsConstructor public class Person { private String name; private String age; public static int compareByAge(Person a,Person b){ return a.age.compareTo(b.age); } }
案例:
public class MethodReferenceTest { public static void main(String[] args) { Person[] persons = new Person[3]; persons[0]=new Person("lucky","25"); persons[1]=new Person("linda","21"); persons[2]=new Person("peter","28"); //使用匿名类 Arrays.sort(persons, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge().compareTo(o2.getAge()); } }); //使用lambda表达式 Arrays.sort(persons, (o1, o2) -> o1.getAge().compareTo(o2.getAge())); //使用lambda表达式和类的静态方法 Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2)); //使用方法引用 //引用的是类的静态方法 Arrays.sort(persons, Person::compareByAge); System.out.println(Arrays.toString(persons)); } }
控制台输出:
[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]
3.引用对象的实例方法
案例:
public class MethodReferenceTest { public static void main(String[] args) { Person[] persons = new Person[3]; persons[0]=new Person("lucky","25"); persons[1]=new Person("linda","21"); persons[2]=new Person("peter","28"); class ComparisonProvider{ public int compareByName(Person a,Person b){ return a.getName().compareTo(b.getName()); } public int compareByAge(Person a,Person b){ return a.getAge().compareTo(b.getAge()); } } ComparisonProvider provider = new ComparisonProvider(); //使用lambda表达式 //对象的实例方法 Arrays.sort(persons,(a,b)->provider.compareByAge(a,b)); //使用方法引用 //引用的是对象的实例方法 Arrays.sort(persons, provider::compareByAge); System.out.println(Arrays.toString(persons)); } }
控制台输出:
[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]
4.引用类型对象的实例方法
案例:
public class MethodReferenceTest { public static void main(String[] args) { String[] stringsArray = {"Hello","World"}; //使用lambda表达式和类型对象的实例方法 Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); //使用方法引用 //引用的是类型对象的实例方法 Arrays.sort(stringsArray, String::compareToIgnoreCase); System.out.println(Arrays.toString(stringsArray)); } }
控制台输出:
[Hello, World]
参考文献:
https://www.cnblogs.com/JohnTsai/p/5806194.html----推荐
https://www.cnblogs.com/tigerlion/p/11182864.html
https://www.runoob.com/java/java8-method-references.html
https://blog.csdn.net/wsgytwsgyt/article/details/80273678