方法引用详解
方法引用对标于Lambda代码块,我们可以通过两者对比来学习方法引用
方法引用初体验
在学习Lambda时,我们创建接口,并直接采用Lambda代码块来代替书写继承类直接执行编译
下面给出代码示例:
代码语言:javascript复制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("接口");
}
}
代码语言:javascript复制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
下面给出示例代码:
代码语言:javascript复制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);
}
}
代码语言:javascript复制public interface Inter {
int toInt(String s);
}
引用对象的实例方法
引用对象的实例方法,实质上是引用类的成员方法
- 格式:对象::成员方法
- 范例:“HelloWorld”::toUpperCase
下面给出示例代码:
代码语言:javascript复制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");
}
}
代码语言:javascript复制public class InterImpl {
public void printUpper(String s){
System.out.println(s.toUpperCase());
}
}
代码语言:javascript复制public interface Inter {
void printUpper(String s);
}
引用类的实例方法
引用类的实例方法,实质上是引用类中的成员方法(注意:这里的成员方法是有对象的)
- 格式:类名::成员方法
- 范例:String::subString
下面给出示例代码:
代码语言:javascript复制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));
}
}
代码语言:javascript复制public interface Inter {
String mySubString(String s,int x,int y);
}
引用构造器
引用构造器,本质上是引用构造方法
- 格式:类名::new
- 范例:Student::new
下面给出示例代码:
代码语言:javascript复制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);
}
}
代码语言:javascript复制public class Student {
String name;
int age;
Student(){
}
Student(String name,int age){
this.name = name;
this.age = age;
}
}
代码语言:javascript复制public interface StudentBuilder {
Student build(String name,int age);
}
结束语
好的,关于方法引用的话题就到这儿了