何是方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用(Lambda表达式的另一种表达形式)
格式
方法引用:使用操作符“::”将方法名和对象或类的名字分隔开来。有如下三种使用情况:
对象::实例方法
对象实例方法
对象::实例方法
/**
* 对象实例方法
* 对象::实例方法
*/
@Test
public void test1(){
Consumer<String> con1 = (x) -> System.out.println(x);
con1.accept("孟楠");
Consumer<String> con2 = System.out::println;
con2.accept("院长");
PrintStream ps = System.out;
Consumer<String> con3 = ps :: println;
con3.accept("孟楠楠");
Consumer<String> con4 = (x) -> ps.println(x);
con4.accept("梦喃喃");
}
@Test
public void test2(){
Employee emp = new Employee();
//共给型函数
Supplier<String> sup = () -> emp.getName();
String name = sup.get();
System.out.println(name);
Supplier<Integer> sup2 = emp::getAge;
Integer age = sup2.get();
System.out.println(age);
}
类::静态方法
@Test
public void test3(){
Comparator<Integer> comp = (x,y) -> Integer.compare(x,y);
System.out.println(comp.compare(3,5));
//使用类::静态方法
Comparator<Integer> comp2 = Integer::compare;
System.out.println(comp2.compare(6,5));
}
类::实例方法
/**
* 类::实例方法名
*/
@Test
public void test4(){
BiPredicate<String,String> bi = (x,y) -> x.equals(y);
System.out.println(bi.test("aa","bb"));
BiPredicate<String,String> bi2 = String::equals;
System.out.println(bi.test("aa1","aa1"));
}
注意
1、实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致
2、当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引用方法的第二个参数(或无参数)时:ClassName::methodName
