方法引用

一、方法引用的本质

  • 还是lambda表达式,本质上还是函数式接口的实例。

二、方法引用的使用

  • 1、使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用

  • 2、方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用中的相同

  • 3、使用格式: 类(或对象):: 方法名

  • 4、具体分为如下的三种情况:

    对象::非静态方法

    public void test1(){
    
            //Lambda表达式
            Consumer<String> con1 = str -> System.out.println(str);
    
            con1.accept("北京");
    
            System.out.println("************************");
    
            //方法引用
            PrintStream ps =  System.out;
    
            Consumer<String> con2 = ps::println;
    
            con2.accept("上海");
    
        }
    public void test2(){
    
            //Lambda表达式
            Employee emp = new Employee("1001","Tom",23,5600);
    
            Supplier<String> sup1 = () -> emp.getName();
    
            System.out.println(sup1.get());
    
            System.out.println("***********************");
    
            //方法引用
            Supplier<String> sup2 = emp::getName;
    
            System.out.println(sup2.get());
    
        }
    

    类::静态方法

    public void test3(){
    
            //Lambda表达式
            Comparator<Integer> com1 = (t1, t2) -> Integer.compare(t1, t2);
    
            System.out.println(com1.compare(12, 21));
    
            System.out.println("***********************");
    
            //方法引用
            Comparator<Integer> com2 = Integer::compare;
    
            System.out.println(com2.compare(12, 21));
    
        }
    
    public void test4(){
    
            //Lambda表达式
            Function<Double,Long> func1 = d -> Math.round(d);
    
            System.out.println(func1.apply(12.6));
    
            System.out.println("******************");
            //方法引用
            Function<Double,Long> func2 = Math::round;
    
            System.out.println(func2.apply(12.6));
    
        }
    

    类::非静态方法

    Comparator 中的int compare(T t1, T t2) 第一个参数当做方法引用类的对象

    String 中的int t1.compareTo(t2)

    public void test5(){
    
            //Lambda表达式
            Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2);
    
            System.out.println(com1.compare("abc","abd"));
    
            System.out.println("*********************");
    
            //方法引用
            Comparator<String> com2 = String::compareTo;
    
            System.out.println(com2.compare("abc","abm"));
    
        }
    
    

三、拓展

  • 1、构造器引用

  • ​ 和方法引用类似,函数式接口的抽象方法的形参列表和构造器的参数列表一致。

  • ​ 抽象方法的返回值的类型即为构造器所属的类的类型

    • Supplier中的 T get()
    • Employee中的空参构造器:Employee()
    public void test6(){
    
            //Lambda表达式
            Supplier<Employee> sup1 = () -> new Employee();
    
            System.out.println(sup1.get());
    
            System.out.println("********************");
    
            //方法引用
            Supplier<Employee> sup2 = Employee::new;
    
            System.out.println(sup2.get());
    
        }
    
    • Function中的R apply(T t)
    • Employee中的一个参数的构造器:Employee(int id)
    public void test7(){
    
            //Lambda表达式
            Function<String, Employee> func1 = (s) -> new Employee(s);
    
            System.out.println(func1.apply("2211"));
    
            System.out.println("********************");
    
            //方法引用
            Function<String, Employee> func2 = Employee::new;
    
            System.out.println(func2.apply("2211"));
    
        }
    
  • 2、数组引用

    • Function 中的R apply(T t)

      ``` java
      public void test8(){
      
              //Lambda表达式
              Function<Integer, String[]> func1 = length -> new String[length];
      
              String[] arr1 = func1.apply(5);
      
              System.out.println(Arrays.toString(arr1));
      
              System.out.println("*****************");
      
              Function<Integer, String[]> func2 = String[]::new;
      
              String[] arr2 = func2.apply(10);
      
              System.out.println(Arrays.toString(arr2));
      
          }
      ```
      
posted @ 2022-03-27 23:00  Espoirr  阅读(62)  评论(0编辑  收藏  举报
--> //烟花