UM2L17——方法的引用和Function接口

方法的引用

使用函数式接口去装载我们在类中声明的方法,而不是lambda表达式

不管是使用lambda表达式还是想要引用方法,我们都需要使用函数式接口来装载
除了Function​以外Java中还写好了很多函数式接口供我们使用,用现成的还是自己写,自己决定即可

如何进行方法的引用

  1. 引用静态方法 类名::静态方法名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    interface ITest01 {
    void fun();
    }

    public class Lesson22 {
    public static void Test() {
    System.out.println("方法调用");
    }

    public static void main(String[] args) {
    ITest01 t = Lesson22::Test;
    t.fun();
    }
    }

    输出:

    1
    方法调用
  2. 引用成员方法 对象名::成员方法名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    interface ITest01 {
    void fun();
    }

    public class Lesson22 {
    public void Test2() {
    System.out.println("方法调用2");
    }

    public static void main(String[] args) {
    Lesson22 l = new Lesson22();
    ITest01 t2 = l::Test2;
    t2.fun();
    }
    }

    输出:

    1
    方法调用2
  3. 引用构造函数

    1. 无参和有参构造 类名::new

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      interface ITest02 {
      Lesson22 fun();
      }

      interface ITest03 {
      Lesson22 fun(int a);
      }

      public class Lesson22 {
      public Lesson22() {
      System.out.println("无参构造");
      }

      public Lesson22(int i) {
      System.out.println("有参构造" + i);
      }

      public static void main(String[] args) {
      ITest02 tt2 = Lesson22::new;
      Lesson22 l2 = tt2.fun();

      ITest03 tt3 = Lesson22::new;
      Lesson22 l3 = tt3.fun(99);
      }
      }

      输出:

      1
      2
      无参构造
      有参构造99
    2. 数组构造 类名[]::new

      对于数组的构造,参数要传入的是数组的长度

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      interface ITest04 {
      Integer[] fun(int n);
      }

      public class Lesson22 {
      public static void main(String[] args) {
      ITest04 tt4 = Integer[]::new;
      Integer[] arr = tt4.fun(9);
      System.out.println(arr.length);
      }
      }

      输出:

      1
      9
  4. 引用泛型方法
    函数式接口的泛型和对应的泛型方法 参数或返回值上一定要对应

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    interface ITest05<T> {
    void fun(T i);
    }

    public class Lesson22 {
    static public<T> void Test3(T i) {
    System.out.println(i);
    }

    public static void main(String[] args) {
    ITest05<Integer> ttt = Lesson22::Test3;
    ttt.fun(999);
    }
    }

    输出:

    1
    999

Function接口

我们在使用lambda表达式时都需要自己声明函数式接口用于装载
为了方便我们的使用,Java在java.util.function​包中提供了预先定义好的函数式接口供我们使用
其中最常用的接口是 Function<T, R>​接口
T​:参数类型
R​:返回值类型
调用方法:apply()

注意:更多的写好的函数式接口 可以直接去function​​包中查看
如果不想记忆,那直接自己写函数式接口即可

1
2
3
4
5
Function<Integer, String> function = (i) -> {
i += 99;
return i.toString();
};
System.out.println(function.apply(1));

输出:

1
100