方法引用的知识层次的构建:
1.引用静态方法
2.引用成员方法
2.1 引用<其他类>的成员方法
2.2 引用<本类>的成员方法
2.3 引用<父类>的成员方法
3.引用构造方法
4.其他的调用方式
4.1 使用<类名>引用<成员方法>
4.2 引用<数组>的<构造方法>
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
public class Main{
public static void main(String[] args){
/*
方法引用的知识层次的构建:
1.引用静态方法
2.引用成员方法
2.1 引用<其他类>的成员方法
2.2 引用<本类>的成员方法
2.3 引用<父类>的成员方法
3.引用构造方法
4.其他的调用方式
4.1 使用<类名>引用<成员方法>
4.2 引用<数组>的<构造方法>
*/
//1.引用静态方法: 类名::静态方法 EG: Integer::parseInt
ArrayList<String> num = new ArrayList<>();
Collections.addAll(num,"1","2","3","4","5");
num.stream().map(new Function<String,Integer>() {
@Override
public Integer apply(String s){
return Integer.parseInt(s);
}
}).forEach(s->System.out.println(s));
num.stream().map(Integer::parseInt).forEach(s->System.out.println(s));
//1.复盘:我们首先使用了map并且创建了一个匿名内部类
//但是发现这个过程过于复杂了 并且此时存在函数式接口
//因此我们想到了方法引用来简化流程
//既然我的函数式接口里面的匿名内部类使用了Integer类的parseInt方法
//那我等会直接在.map的范围内,直接方法引用这个类里的方法 简单快捷
//此时我们再巩固一下记忆:new Function泛型一定是前者传入 后者传出 并且不可使用基本数据类型
System.out.println("————————————————————————————————");
//2.引用成员方法 格式: 对象::成员方法
//其他类: 其他类对象:方法名
//本类: this::方法名
//父类:super::方法名
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");
list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s->System.out.println(s)
);
list.stream().filter(new StringOperaton()::StringJudge).forEach(s->System.out.println(s));
//这里我们补充一个细节:我们使用其他类的成员方法的引用的时候
//往往需要先创建这个类的对象 然后再在对对象进行::操作符
list.stream().filter(this::StringJudge).forEach(s->System.out.println(s));//欸?这里怎么报错了 我不是想使用this来调用本类方法吗
//你是不是忘记了一件事! 在静态类中调用方法是不可以用this的 因此我们需要创建一个本类对象再来调用 我们这个类不是叫Main么
list.stream().filter(new Main()::StringJudge).forEach(s->System.out.println(s));
//是不是发现了 这样就可以调用
}
public boolean StringJudge(String s){
return s.startsWith("张")&&s.length()==3;
};//这个方法就是那个this无法直接调用的方法
}