ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

方法引用详解

2022-07-06 15:38:22  阅读:91  来源: 互联网

标签:useInter String void 详解 引用 方法 public


方法引用详解

方法引用对标于Lambda代码块,我们可以通过两者对比来学习方法引用

方法引用初体验

在学习Lambda时,我们创建接口,并直接采用Lambda代码块来代替书写继承类直接执行编译

下面给出代码示例:

public class Demo {
    public static void main(String[] args) {
        //我们先回顾lambda方法
        useInter((String s) -> {
            System.out.println(s);
        });

        useInter(s -> System.out.println(s));

        //然后我们在lambda基础上采用方法引用符::
        useInter(System.out::println);
    }

    public static void useInter(Inter inter){
        inter.run("接口");
    }
}
public interface Inter {
    void run(String s);
}

方法引用符

方法引用符:

  • ::该符号为引用运算符,而它所在的表达式被称为方法引用

回顾对比一下我们体验方法引用的代码:

  • Lambda代码块:useInter(s -> System.out.println(s));
  • 方法引用:useInter(System.out::println);

我们可以看到我们直接使用System.out中的println,省略掉了参数的书写以及参数的带入,而是直接使用方法

推导和省略:

  • 如果使用Lambda,那么根据“可推导就是可省略”原则,无需指定参数类型,无需指定重载形式,他们都将被自动推导
  • 如果使用方法引用,那么同样可以实现自动推导
  • 方法引用时Lambda的孪生兄弟

方法引用四种方法

方法引用可以分为四种情况:

  • 引用类方法
  • 引用对象的实例方法
  • 引用类的实例方法
  • 引用构造器

下面我们将一一讲解

引用类方法

引用类方法,实质上是引用类的静态方法

  • 格式:类名::静态方法
  • 范例:Integer::parseInt

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //老规矩,我们先给出lambda方法
        useInter((String s) -> {
            return Integer.parseInt(s);
        });

        useInter(s -> Integer.parseInt(s));

        //然后我们给出引用类方法: 类::方法
        //(这里的参数全部放入类方法的参数)
        useInter(Integer::parseInt);
    }

    public static void useInter(Inter inter){
        int i = inter.toInt("666");
        System.out.println(i);
    }
}
public interface Inter {
    int toInt(String s);
}

引用对象的实例方法

引用对象的实例方法,实质上是引用类的成员方法

  • 格式:对象::成员方法
  • 范例:“HelloWorld”::toUpperCase

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //首先给出Lambda方法
        useInter(s -> System.out.println(s.toUpperCase()));

        //然后我们采用引用对象的方法
        //(这里的参数全部放入类成员方法的参数)
        InterImpl i = new InterImpl();
        useInter(i::printUpper);
    }

    public static void useInter(Inter inter){
        inter.printUpper("HelloWorld");
    }
}
public class InterImpl {
    public void printUpper(String s){
        System.out.println(s.toUpperCase());
    }
}
public interface Inter {
    void printUpper(String s);
}

引用类的实例方法

引用类的实例方法,实质上是引用类中的成员方法(注意:这里的成员方法是有对象的)

  • 格式:类名::成员方法
  • 范例:String::subString

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //lambda方法
        useInter((String s,int x,int y) -> {
            return s.substring(x,y);
        });

        //转化为类的实例方法
        //(第一个参数作为类的实例对象,后面参数作为参数带入)
        useInter(String::substring);
    }

    public static void useInter(Inter inter){
        System.out.println(inter.mySubString("HelloWorld",3,5));
    }
}
public interface Inter {
    String mySubString(String s,int x,int y);
}

引用构造器

引用构造器,本质上是引用构造方法

  • 格式:类名::new
  • 范例:Student::new

下面给出示例代码:

public class Demo {
    public static void main(String[] args) {
        //lambda:
        createStudent((String name,int age) ->{
            return new Student(name,age);
        });

        createStudent((String name,int age) -> new Student(name,age));

        //引用构造器:(所有参数均带入类的构造参数)
        createStudent(Student::new);
    }

    //提供方法构造Student
    public static void createStudent(StudentBuilder sb){
        Student student = sb.build("孙策",18);
        System.out.println(student.name + student.age);
    }
}
public class Student {
    String name;
    int age;

    Student(){

    }

    Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}
public interface StudentBuilder {
    Student build(String name,int age);
}

结束语

好的,关于方法引用的话题就到这儿了

标签:useInter,String,void,详解,引用,方法,public
来源: https://www.cnblogs.com/qiuluoyuweiliang/p/16450998.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有