方法引用主要是指的将已有的方法拿过来当成函数式接口中抽象方法的方法体进行使用。
有一下几点要求,只有满足的话才可以进行替换。
1.引用处必须是函数式接口
2.被引用的方法必须已经存在
3。被引用方法的形参和返回值需要跟抽象方法保持一致
满足这几个就可以当作引用方法使用了。
举例,比如说我们的数组排序,使用Arrays中的sort方法进行排序,当我们使用自定义排序的时候,正常情况下是直接使用后compareto,然后重写compare方法,但是现在我们可以直接使用lambda表达式,也可以使用方法引用的模式处理这个情况。
完整代码
需要记住,这种排序的话只用于对象类型的数组,并不适合基本类型的数组,主要是comparable接口中传入了比较器函数,而基本数据类型的数组中没有实现这种接口,所以无比较器函数的,去掉转换的那段代码是会出现问题的。、
也可以直接使用Integer类型的数组,让其自动转换。
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 32, 4, 5, 66, 54};
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new); // 将int数组转换为Integer对象数组
Arrays.sort(boxedArr, new Comparator<Integer>() { // 创建一个实现Comparator接口的匿名内部类
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 实现降序排序
}
});
System.out.println(Arrays.toString(boxedArr)); // 打印排序后的结果
}
}
使用 lambda表达式的写法
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 32, 4, 5, 66, 54};
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new); // 将int数组转换为Integer对象数组
Arrays.sort(boxedArr, ( o1, o2) ->o2 - o1); // 实现降序排序);
System.out.println(Arrays.toString(boxedArr)); // 打印排序后的结果
}
}
使用这种方法引用的处理,主要就是调用已经写好的方法,注意格式就是类名::方法 其中::是方法引用符。静态方法引用就是直接类名.方法名即可。
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 32, 4, 5, 66, 54};
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new); // 将int数组转换为Integer对象数组
Arrays.sort(boxedArr, Main::com); // 实现降序排序);
System.out.println(Arrays.toString(boxedArr)); // 打印排序后的结果
}
public static int com(int a,int b){
return a -b;
}
}