方法引用

方法引用

1、概述

顾名思义:

方法就是我们之前学习的方法

引用就是把已经有的方法拿过来用,把他当做函数式接口中抽象方法的方法体(引用的方法,可以是Java已经写好的,也可以是一些第三方工具类)

例如:Arrays.sort(arr,比较规则);

我们之前都是在第二个参数里面写匿名内部类或者Lambda表达式,方法引用呢实际就是可以在第二个参数那里直接调用你的方法,那个方法是你自己定义好的比较规则。

在之后的MyBatis Plus 的学习中将会频繁用到方法引用。

注意点:

  • 引用出必须是函数式接口,
  • 被引用的方法必须已经存在。
  • 被引用的方法的形参和返回值必须和需要的抽象方法保持一致。
  • 被引用方法的功能要满足当前需求

方法引用符:: :(双英文冒号)

初爽方法引用

/**
 * @author 戒爱学Java
 * @date 2023/3/23 11:19
 */
public class FunctionDemo1 {
    public static void main(String[] args) {
        //需求:创建一个数组,进行倒序排列
        Integer[] arr = {3, 5, 4, 1, 6, 2};

        //匿名内部类
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1 ;
            }
        });

        //Lambda表达式
        Arrays.sort(arr, (Integer o1, Integer o2)-> {
                return o2 - o1 ;
        });

        //Lambda表达式简化
        Arrays.sort(arr, ( o1,  o2)-> o2 - o1);

        //方法引用
        Arrays.sort(arr,FunctionDemo1::subtraction);
    }

    public static int subtraction(int num1, int num2) {
        return num2 - num1;
    }

}

2、分类

  1. 引用静态方法

    格式:类名: : 静态方法

    范例:Integer: : parseInt

    练习:集合中有以下数据,要求把他们变成int类型

    ​ "1", "2", "3", "4", "5", "6", "7"

    /**
     * @author 戒爱学Java
     * @date 2023/3/23 11:43
     */
    public class FunctionDemo2 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list,"1", "2", "3", "4", "5", "6", "7");
    
            //1、常规方法:遍历集合,将每个元素进行转换,存到一个新的集合当中
            //2、可以采用流的方法map进行数据类型转换
            list.stream().map(Integer::parseInt).forEach(s -> System.out.print(s + " "));
        }
    }
    
  2. 引用成员方法

    格式:对象: : 成员方法

    1. 引用其他类的成员方法

      其他类:其他类对象: : 方法名

    2. 引用本类的成员方法

      本类:this : : 方法名

      注意点:不能再静态方法里面调用,因为静态方法里没有this关键字

    3. 引用父类的成员方法

      父类:super : : 方法名

      注意点:不能再静态方法里面调用,因为静态方法里没有this关键字

    练习1:集合中有一些名字,按照要求过滤

    /**
     * @author 戒爱学Java
     * @date 2023/3/23 11:48
     */
    public class FunctionDemo3 {
        public static void main(String[] args) {
            /**
             * 只要以张开头,而且是三个字
             * 
             */
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");
            list.stream().filter(new StringOperation()::stringJudge).forEach(s -> System.out.println(s));
        }
    }
    

    练习2:GUI界面中点击事件的方法引用写法

    关于GUI网上了解即可,目前已经被淘汰,不使用了
    用法就是上面写的语法,注意点就是不要再静态方法里使用即可。
    
  3. 引用构造方法

    格式:类名: : new

    范例:Student : : new

    练习:集合里面存储姓名和年龄,比如:张无忌,15 要求:将数据封装成Student对象并收集到List集合中

    //Student里面重载构造函数,那么在使用map方法的时候可以使用引用构造方法来替换规则。
    public Student(String str) {
            String[] arr = str.split(",");
            this.name = arr[0];
            this.age  = Integer.parseInt(arr[1]);
    }
    
    /**
     * @author 戒爱学Java
     * @date 2023/3/23 13:12
     */
    public class FunctionDemo4 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list,"张无忌,10","赵敏,15","周芷若,20","张强,35","张三丰,60",
                    "张翠山,11","张良,22","王麻子,33","谢广坤,44");
            List<Student> newList = list.stream().map(Student::new).collect(Collectors.toList());
            System.out.println(newList);
        }
    }
    
  4. 其他调用该方式

    1. 使用类名引用成员方法

      格式:类名: : 成员方法

      范例:String : : substring

      练习:集合里面一些字符串,要求变成大写后进行输出。

      /**
       * @author 戒爱学Java
       * @date 2023/3/23 13:33
       */
      public class FunctionDemo5 {
          public static void main(String[] args) {
              ArrayList<String> list = new ArrayList<>();
              Collections.addAll(list,"aaa","bbb","ccc","ddd","fff","ggg");
              list.stream().map(String::toUpperCase).forEach(s-> System.out.println(s));
          }
      }
      

      抽象方法形参的详解:
      第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法
      在Stream流当中,第一个参数一般都表示流里面的每一个数据。
      假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用string这个类中的方法
      第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法

    2. 引用数组的构造方法

      格式:类数据类型[]: : new

      范例:int[]: : new

      练习:集合里面存一些整数,收到数组当中。

      /**
       * @author 戒爱学Java
       * @date 2023/3/23 14:20
       */
      public class FunctionDemo6 {
          public static void main(String[] args) {
              ArrayList<Integer> list = new ArrayList<>();
              Collections.addAll(list,1,2,3,4,5,6,7);
              Integer[] arr = list.stream().toArray(Integer[]::new);
              System.out.println(Arrays.toString(arr));
          }
      }
      
posted @ 2023-03-25 20:33  戒爱学Java  阅读(30)  评论(0编辑  收藏  举报