什么是方法引用?:针对于函数式接口中的抽象方法
为什么用方法引用?:避免代码的重复,简便书写,提高效率
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作
那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?答案肯定是没有必要
方法引用格式符号: ::
方法引用的条件?:必须遵循
方法引用的分类:
1.引用静态方法
1.1 格式
1.2 示例
为什么调用parseInt?符合方法调用要求,与函数式接口中的抽象方法形式相同,如下面的对比图
2.引用成员方法
2.1格式:其他类要创建成员对象
因为静态方法中,没有this,非要引用本类的静态成员方法的话:new 本类 ::方法名
3.引用构造方法
3.1 格式
3.2 示例
不使用方法引用:
使用方法引用:
添加符合方法引用的构造方法:
why:无需考虑对象的创建? answer:构造方法实现后自动会创建对象
4.特殊:使用类名调用成员方法
4.1 格式
特殊点:采用"使用类名调用成员方法"的引用方法时,stream流中的数据类型决定了我可以使用哪个类,不可以任意选择类,只能选择和stream流中的数据类型相同的
4.2 示例
不使用方法引用:Map是要改的主体
使用方法引用:
疑惑点:并不符合引用方法条件为啥也能用?
采用"使用类名调用成员方法"的引用方法时,参考这条:
map中第一个参数是string,而没有第二个参数,所以是无参的,而toUpperCase是无参的,
并且只能使用string类中的成员方法!!!
可以理解为:所以必须使用和stream中数据相同的类型的类
5.特殊:引用数组的构造方法
5.1 格式:就是生成一个:该数据类型的数组
5.2 示例:
不使用方法引用:
使用方法引用:直接integer::new
6.三道练习题
public class Test1 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张三,23","李四,24","王五,25","大的的,27");list.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {return new Student(s.split(",")[0],Integer.parseInt(s.split(",")[1]));}});//将map的抽象方法使用:方法引用list.stream().map(Student::new).toArray(new IntFunction<Student[]>() {@Overridepublic Student[] apply(int value) {return new Student[value];}});//将toArray的抽象方法使用:方法引用Student[] arr = list.stream().map(Student::new).toArray(Student[]::new);System.out.println(Arrays.toString(arr));}
}
在student中:新写了一个构造方法,方便Map引用
重写tostring方法: