个人理解:方法引用承接自Lambda表达式,若Lambda表达式中的内容已经有方法实现了,那么就可以使用方法引用,Lambda表达式中只有一个方法的时候就可以使用方法引用.
下面介绍方法引用的三种格式
- 格式一 对象::实例方法名
注意:Lambda体中的方法的参数列表和返回值要与所实现函数式接口的参数列表和返回值保持一致
@Test
public void Test1() {
//举例1
Consumer<String> con = (x) -> System.out.println(x);//使用Lambda表达式
con.accept("Hello");
Consumer<String> con1 = System.out::println; //使用方法引用
con1.accept("World");
//举例2
Student student = new Student("Moti",10,"男");
Supplier<String> stuName = () -> student.getName(); //使用Lambda表达式
System.out.println(stuName.get());
Supplier<String> stuName1 = student::getName; //使用方法引用
System.out.println(stuName1.get());
}
输出结果如下:
可见使用Lambda表达式的写法和使用方法引用的写法的效果是一样的!使用方法引用会更加简化代码
- 格式二 类名::静态方法名
注意:Lambda体中的方法的参数列表和返回值要与所实现函数式接口的参数列表和返回值保持一致
@Test
public void Test2() {
Comparator<Integer> com = (x,y) -> Integer.compare(x, y);//使用Lambda表达式
Comparator<Integer> com1 = Integer::compare; //使用方法引用
}
两者的使用效果同样也是一样的.
- 格式三 类名::实例方法名
注意:
Lambda体中的方法的参数列表和返回值要与所实现函数式接口的参数列表和返回值保持一致
第一个参数是lambda体中方法的调用者,第二个参数是方法的参数时,可以使用 类名::实例方法名的方法引用
@Test
@Test
public void Test3() {
BiPredicate<String, String> bp = (x,y) -> x.equals(y); //使用Lambda表达式
BiPredicate<String, String> bp1 = String::equals; //使用方法引用
}
两者的使用效果同样也是一样的.