把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体
条件:
1.引用处必须是函数式接口
2.被引用的方法必须已经存在
3.被引用方法的形参和返回值需要跟抽象方法保持一致
4.被引用方法的功能要满足当前需求
::是什么符号?
方法引用符
代码案例:
对一个数组从大到小排序
public class text5 {
public static void main(String[] args) {
Integer[]arr ={3,5,4,1,6,2};
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(Arrays.toString(arr));
Arrays.sort(arr, FunctionDemo1::sub);
System.out.println(Arrays.toString(arr));
//是FunctionDemo1类中的方法 static静态引用方法类名::方法名
public static int sub(int num1,int num2){
return num1-num2;
}
方法引用的分类:
引用静态方法:
之前:类名.静态方法
格式:类名::静态方法
范例:Integer:: rsent
练习:
集合中有以下数字,要求把他们都变成int类型
"1","2","3","4","5"
被引用方法的形参和返回值需要跟抽象方法保持一致:
引用成员方法:
之前:对象.成员方法
格式:对象::成员方法
其他类:其他类对象::方法名
本类:this::方法名 注意:引用处不能是静态方法静态方法中没有this和super关键字的
父类:super::方法名
其他类的引用成员方法
练习:
集合中有一些名字,按照要求过滤数据
数据:“张无忌","周芷若","赵敏","张强","张三丰"
要求:只要以张开头,而且名字是3个字的
由于Java没有写好的过滤方法:需要我们自己写一个:
注意:被引用方法的形参和返回值需要跟抽象方法保持一致:
引用构造方法:
格式:类名::new
范例:Student::new
练习
集合里面存储姓名和年龄,比如:张无忌,15
要求:将数据封装成Student对象并收集到List集合中
因为被引用方法的形参和返回值需要跟抽象方法保持一致,而student类中没有一致的,所以需要在student类中在加一个构造方法用来跟抽象方法保持一致。
使用类名引用成员方法:
格式:类名::成员方法
范例:String::substring
练习:
集合里面一些字符串,要求变成大写后进行输出
原因:
局限性:
不能引用所有类中的成员方法。
是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法。
引用数组构造方法:
格式:数据类型[]::new
范例:int[]::new
练习:
集合中存储一些整数,收集到数组当中
public class text10 {
public static void main(String[] args) {
ArrayList<Integer>list=new ArrayList<>();
Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);
Integer[] arr = list.stream().toArray(Integer[]::new);
System.out.println(Arrays.toString(arr));
}
}