[Java][方法引用]综述以及静态/成员中的其他与本类方法讲解

方法引用的知识层次的构建:
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 num = new ArrayList<>();
        Collections.addAll(num,"1","2","3","4","5");
        num.stream().map(new Function() {
            @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 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无法直接调用的方法



    }



你可能感兴趣的:(java,python,开发语言)