美文网首页
方法引用

方法引用

作者: flyjar | 来源:发表于2022-08-27 09:49 被阅读0次

    符号说明:
    双冒号为方法引用运算符,而它所在的表达式被称为 方法引用
    应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方
    法引用。

    重点:
    方法引用,提供的方法一定要和函数式接口的方法是一样的入参和出参
    例如:

    /**
     * @author jia
     * @date 2022-08-27
     * @desc com.example
     * @since 1.0
     */
    public class MethodRefrence {
    
        /**
         * 当这个方法和Consumer这个函数式接口中的accpt方法是一样的入参和出参时
         * 就可以直接用方法引用了
         */
        public void calcTotal(Integer[]numbers){
    
            Integer total = 0;
    
            for (int i = 0; i <numbers.length ; i++) {
    
                total+=numbers[i];
    
            }
    
            System.out.println(total);
        }
    
    
        /**
         * 调用consumer具体的实现
         */
        public  void printlnTotal(Consumer<Integer[]> consumer){
    
            Integer[]numbers={12,12,3,12312,3,12,312,3,12,1};
    
            consumer.accept(numbers);
    
        }
        
        public static void main(String[] args) {
    
            MethodRefrence methodRefrence =new MethodRefrence();
    
            //printlnTotal方法的参数 Consumer对象的方法正好和calcTotal是一样的出入参。就可以使用方法引用
            methodRefrence.printlnTotal(methodRefrence::calcTotal);
    
        }
    }
    

    常见的引用方式:

    方法引用在JDK8中使用是相当灵活的,有以下几种形式:

      1. instanceName::methodName 对象::方法名
      1. ClassName::staticMethodName 类名::静态方法
      1. ClassName::methodName 类名::普通方法
      1. ClassName::new 类名::new 调用的构造器
      1. TypeName[]::new String[]::new 调用数组的构造器
    • 对象:方法名

    获取当前的时间戳:
    Supplier函数式接口,正好提供了一个只有返回值的get()抽象方法,而now.getTime()方法,也正好是一个只有返回值的方法。所以可以直接使用方法引用

    public static void main(String[] args) {
            Date now =new Date();
             Supplier<Long> supplier =()->{  return now.getTime(); };
            
            Supplier<Long> supplierRefrence =now::getTime;
        }
    
    • 类名::静态方法

    获取系统纳秒数:
    Supplier函数式接口,正好提供了一个只有返回值的get()抽象方法,而System的静态方法nanoTime,也正好是一个只有返回值的方法。所以可以直接使用方法引用。注意:这里是直接了用了类的静态方法

    public static void main(String[] args) {
    
            Supplier<Long> supplier = ()->{  return System.nanoTime(); };
    
             Supplier<Long> supplierRefrence = System::nanoTime;
        }
    
    • 类名::普通方法

    类名::普通方法必须得是有入参的函数式接口才能用。这个类名实际上就是对于入参的一个代替。类名的实际值就是入参


    image.png
    • 类名::new 调用的构造器

    函数式接口必须得是有返回值的才能用。

    public static void main(String[] args) {
    
           Supplier supplier = ()->{return new MethodRefrence();};
           
           Supplier supplierRefrence = MethodRefrence::new;
        }
    
    • String[]::new 调用数组的构造器

    函数式接口必须得是只有一个返回值,一个入参。入参作为数组的长度

     public static void main(String[] args) {
    
           Function<Integer, String[]> function = (len)->{return new String[len];};
    
           Function<Integer, String[]> functionRefrence = String[]::new;
        }
    

    相关文章

      网友评论

          本文标题:方法引用

          本文链接:https://www.haomeiwen.com/subject/xsyagrtx.html