方法引用
1、概述
顾名思义:
方法就是我们之前学习的方法
引用就是把已经有的方法拿过来用,把他当做函数式接口中抽象方法的方法体(引用的方法,可以是Java已经写好的,也可以是一些第三方工具类)
例如:Arrays.sort(arr,比较规则);
我们之前都是在第二个参数里面写匿名内部类或者Lambda表达式,方法引用呢实际就是可以在第二个参数那里直接调用你的方法,那个方法是你自己定义好的比较规则。
在之后的MyBatis Plus 的学习中将会频繁用到方法引用。
注意点:
- 引用出必须是函数式接口,
- 被引用的方法必须已经存在。
- 被引用的方法的形参和返回值必须和需要的抽象方法保持一致。
- 被引用方法的功能要满足当前需求
方法引用符:: :(双英文冒号)
初爽方法引用:
/**
* @author 戒爱学Java
* @date 2023/3/23 11:19
*/
public class FunctionDemo1 {
public static void main(String[] args) {
//需求:创建一个数组,进行倒序排列
Integer[] arr = {3, 5, 4, 1, 6, 2};
//匿名内部类
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1 ;
}
});
//Lambda表达式
Arrays.sort(arr, (Integer o1, Integer o2)-> {
return o2 - o1 ;
});
//Lambda表达式简化
Arrays.sort(arr, ( o1, o2)-> o2 - o1);
//方法引用
Arrays.sort(arr,FunctionDemo1::subtraction);
}
public static int subtraction(int num1, int num2) {
return num2 - num1;
}
}
2、分类
-
引用静态方法
格式:类名: : 静态方法
范例:Integer: : parseInt
练习:集合中有以下数据,要求把他们变成int类型
"1", "2", "3", "4", "5", "6", "7"
/** * @author 戒爱学Java * @date 2023/3/23 11:43 */ public class FunctionDemo2 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"1", "2", "3", "4", "5", "6", "7"); //1、常规方法:遍历集合,将每个元素进行转换,存到一个新的集合当中 //2、可以采用流的方法map进行数据类型转换 list.stream().map(Integer::parseInt).forEach(s -> System.out.print(s + " ")); } }
-
引用成员方法
格式:对象: : 成员方法
-
引用其他类的成员方法
其他类:其他类对象: : 方法名
-
引用本类的成员方法
本类:this : : 方法名
注意点:不能再静态方法里面调用,因为静态方法里没有this关键字
-
引用父类的成员方法
父类:super : : 方法名
注意点:不能再静态方法里面调用,因为静态方法里没有this关键字
练习1:集合中有一些名字,按照要求过滤
/** * @author 戒爱学Java * @date 2023/3/23 11:48 */ public class FunctionDemo3 { public static void main(String[] args) { /** * 只要以张开头,而且是三个字 * */ ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰"); list.stream().filter(new StringOperation()::stringJudge).forEach(s -> System.out.println(s)); } }
练习2:GUI界面中点击事件的方法引用写法
关于GUI网上了解即可,目前已经被淘汰,不使用了 用法就是上面写的语法,注意点就是不要再静态方法里使用即可。
-
-
引用构造方法
格式:类名: : new
范例:Student : : new
练习:集合里面存储姓名和年龄,比如:张无忌,15 要求:将数据封装成Student对象并收集到List集合中
//Student里面重载构造函数,那么在使用map方法的时候可以使用引用构造方法来替换规则。 public Student(String str) { String[] arr = str.split(","); this.name = arr[0]; this.age = Integer.parseInt(arr[1]); } /** * @author 戒爱学Java * @date 2023/3/23 13:12 */ public class FunctionDemo4 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"张无忌,10","赵敏,15","周芷若,20","张强,35","张三丰,60", "张翠山,11","张良,22","王麻子,33","谢广坤,44"); List<Student> newList = list.stream().map(Student::new).collect(Collectors.toList()); System.out.println(newList); } }
-
其他调用该方式
-
使用类名引用成员方法
格式:类名: : 成员方法
范例:String : : substring
练习:集合里面一些字符串,要求变成大写后进行输出。
/** * @author 戒爱学Java * @date 2023/3/23 13:33 */ public class FunctionDemo5 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"aaa","bbb","ccc","ddd","fff","ggg"); list.stream().map(String::toUpperCase).forEach(s-> System.out.println(s)); } }
抽象方法形参的详解:
第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法
在Stream流当中,第一个参数一般都表示流里面的每一个数据。
假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用string这个类中的方法
第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法 -
引用数组的构造方法
格式:类数据类型[]: : new
范例:int[]: : new
练习:集合里面存一些整数,收到数组当中。
/** * @author 戒爱学Java * @date 2023/3/23 14:20 */ public class FunctionDemo6 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); Collections.addAll(list,1,2,3,4,5,6,7); Integer[] arr = list.stream().toArray(Integer[]::new); System.out.println(Arrays.toString(arr)); } }
-