方法引用概述
把已经有的方法拿过来用,当作函数式接口中抽象方法的整体.
方法引用符: ::
方法引用规则:
- 引用出必须是函数式接口
- 被引用的方法必须已存在
- 被引用的方法的形参与返回值必须和抽象方法保持一致
- 被引用方法必须满足当前功能要求
{
Arrays.sort(arr,FunctionDemo1::subtraction); //静态方法类名调用
System.out.println(Arrays.toString(arr));
}
private static int subtraction(int o1,int o2) {
return o2 - o1;
}
引用静态方法
格式:类名::静态方法
范例:Integer::parseInt
list.stream().map(Integer::parseInt).forEach(s -> System.out.println(s));
引用成员方法
格式:对象::成员方法
- 其他类:其他类对象::方法名
- 本类:this::方法名
- 父类:super::方法名
注:2.和3.的引用方法不能是静态方法
引用构造方法
格式:类名::new
范例:Student::new(目的就是为了创建对象)
其他调用方式
使用类名引用成员方法
格式:类名::成员方法
特有规则:
- 需要有函数式接口
- 被引用的方法必须存在
- 被引用方法的形参,需要和抽象方法的第二个形参到最后一个形参保持一致,返回值也要保持一致
- 被引用的方法的功能需要满足当前需求
抽象方法形参详解:
第一个参数:
表示被引用方法的调用者,决定了可以引用哪些类的方法。
在Stream流当中,第一个参数一般都表示流里面的每一个数据。
假设流里面的数据是字符串,那么用这种方式进行方法引用,只能引用String这个类的方法。
第二个参数到最后一个参数:
跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要的是无参的成员方法。
引用数组的构造方法
格式:数据类型[] ::new
目的:创建一个指定类型的数组
细节:数组的类型,需要和流中的数据的类型保持一致
//1.创建集合并添加元素
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);
//2.收集到数组中
Integer[] arr2 = list.stream.toArray(Integer[]::new);
System.out.println(Arrays.toString(arr2));