方法引用(超详细)
一:方法引用概述
(1)方法引用:把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体。
举个例子:
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
假如这里有一个方法,Arrays里面的排序方法sort,正常书写的时候,第一个参数表示要排序的数组,第二个参数就是排序的规则,在代码当中需要传递Comparator接口的实现类对象。因为Comparator是一个函数式接口,所以我们可以用Lambda表达式简化。但是Lambda还不是最简单的,还可以进一步简化。这里的排序规则甚至可以不用写,可以把已经存在的方法拿过来用,把这个已经存在的方法当做是函数是接口中抽象方法的方法体。
public int subtraction(int n1, int n2) {
return r2 - r1;
}
比如现在已经有一个已经写好的subtraction方法,那么在sort方法的第二个参数中,我们就可以直接去使用它,这就是方法引用。但不是所有的方法都可以直接引用,需要满足下面四个条件:
1、引用处必须是函数式接口
2、被引用的方法必须是已经存在的
3、被引用方法的形参和返回值需要跟抽象方法保持一致。
在Comparator接口中,有一个抽象方法compare,这个方法有两个形参,这两个形参都是整数,返回值也是整数。再看我们的subtraction方法,形参也是两个整数,返回值也是整数,此时他们就对应起来了。
4、被引用方法的功能要满足当前需求
(2)需求:创建一个数组,进行倒序排序
public class Test1 {
public static void main(String[] args) {
// 需求:创建一个数组,进行倒序排序
Integer[] arr = {
3, 5, 4, 6, 2, 8, 7};
// 匿名内部类
// Arrays.sort(arr, new Comparator<Integer>() {
// @Override
// public int compare(Integer o1, Integer o2) {
// return o2 - o1;
// }
// });
// System.out.println(Arrays.toString(arr));
// Lambda表达式简化
// Arrays.sort(arr, (o1, o2) -> o2 - o1);
// System.out.println(Arrays.toString(arr));
// 方法引用
// 1.引用处需要是函数式接口
// 2.被引用方法必须已经存在
// 3.被引用方法的形参和返回值需要跟抽象方法的形参和返回值保持一致
// 4.被引用方法的功能需要满足当前的要求
// 表示引用Test1类里面的subtraction方法
// 把这个方法当做抽象方法的方法体
Arrays.sort(arr, Test1::subtraction);
System.out.println(Arrays.toString(arr));
}
public static int subtraction(int a, int b) {
return b - a;
}
}
(3)小结
1、什么是方法引用?
把已经存在的方法拿过来用,当做函数式接口中抽象方法的方法体
2、::是什么符号?
方法引用符
3、方法引用时需要注意什么?
(1)需要有函数式接口
(2)被引用方法需要已经存在
(3)被引用方法的形参和返回值需要跟抽象方法的形参和返回值保持一致
(4)被引用方法的功能要满足当前的需求
二:引用静态方法
格式:类名::静态方法(以前调用静态方法是类名.静态方法)
范例:Integer::parseInt
练习:集合中有以下数字,把他们变成int类型
“1”, “2”, “3”, “4”, “5”
public class Test2 {
public static void main(String[] args) {
// 练习:集合中有以下数字,把他们变成int类型
// 1.创建集合并添加元素
List<String> list = new ArrayList<>();
Collections.addAll(list, "1", "2", "3", "4", "5");
// 2.把他们都变为int类型
// list.stream().map(new Function<String, Object>() {
// @Override
// public Object apply(String s) {
// return Integer.parseInt(s);
// }
// }).forEach(s -> System.out.println(s));
// 3.方法引用
list.stream().map(