方法引用初体验
方法 引用 初体验
2023-06-13 09:13:58 时间
方法引用详解
方法引用对标于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);
}
结束语
好的,关于方法引用的话题就到这儿了
相关文章
- 方法引用与构造器引用
- SAP ABAP 方法调用里传值(Pass Value)和传引用(Pass Reference)的区别试读版
- 【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
- 你知道Java 8 的方法引用吗
- Postgresql 如何查询表引用或被引用的外键方法
- Linux下调用可执行文件的方法(linux调用可执行文件)
- MySQL实现整数取整的方法(mysql取整数)
- 用户MySQL:授予所有用户权限的简单方法(mysql授权所有)
- Linux串口检测方法详解,轻松解决串口连接问题(linux串口检测)
- Linux命令mv批量操作文件的方法与技巧(linuxmv批量)
- Oracle中删除临时表的方法(oracle中删除临时表)
- javascript引用对象的方法
- javascript引用对象的方法代码
- PHP中函数内引用全局变量的方法
- phpMyAdmin安装配置方法和问题解决
- apache支持php5的配置方法
- 使ecshop模板中可引用常量的实现方法
- asp.net运行提示未将对象引用设置到对象的实例错误解决方法
- 基于PHP遍历数组的方法汇总分析
- javascript文件中引用依赖的js文件的方法
- PHP引用(&)各种使用方法实例详解
- jquery的each方法使用示例分享
- PHP的foreach中使用引用时需要注意的一个问题和解决方法
- Android中引用其他程序的文本资源超简单方法
- Java函数式编程(八):字符串及方法引用