当我们在Java8中使用Lambda表达式(Functional Interface)时,我们通常使用双冒号(::)操作符来引用方法。这种方式也称为方法引用(Method Reference),它提高了程序的可读性和简化了代码。
当我们在Java8中使用Lambda表达式(Functional Interface)时,我们通常使用双冒号(::)操作符来引用方法。这种方式也称为方法引用(Method Reference),它提高了程序的可读性和简化了代码。
与Lambda表达式类似,方法引用也需要和特定的Functional Interface搭配使用。在Java 8中,Java中提供了4种不同的方法引用类型,分别是:
-
引用静态方法,如:
ClassB::staticMethod -
引用含有特定对象实例方法的实例方法,如:
obj::instanceMethod -
引用含有特定类型对象的实例方法,如:
ClassB::instanceMethod -
引用构造函数,如:
ClassB::new
下面分别介绍这四种不同的方法引用类型以及它们的使用方法。
引用静态方法
ClassB::staticMethod 表示引用 ClassB 类中的静态方法 staticMethod。在 Lambda 表达式中,可能会使用到 staticMethod 方法,并且这个方法静态的,我们可以直接使用上述的语言形式代替 Lambda 表达式。
以下是一个示例代码:
public class MethodRefExample {
public static void printHello() {
System.out.println("Hello");
}
public static void main(String[] args) {
Runnable helloTask = MethodRefExample::printHello;
helloTask.run();
}
}
以上代码定义了一个 Runnable 类型的 helloTask 对象,将 MethodRefExample 的 printHello 方法作为实现方法赋值给这个对象,并在 main 方法中调用 helloTask.run() 方法输出 Hello 字符串。
引用含有特定对象实例方法的实例方法
obj::instanceMethod 表示引用 obj 对象中的实例方法 instanceMethod,当 Lambda 表达式需要访问一个对象实例的方法并且这个对象实例方法已经存在时,我们可以使用这种方式来代替 Lambda 表达式。
以下是一个示例代码:
public class MethodRefExample {
public void printHello() {
System.out.println("Hello");
}
public static void main(String[] args) {
MethodRefExample instance = new MethodRefExample();
Runnable helloTask = instance::printHello;
helloTask.run();
}
}
以上代码定义了一个 MethodRefExample 类型的 instance 对象,将实例方法 printHello 作为实现方法赋值给 Runnable 类型的 helloTask 对象,并在 main 方法中调用 helloTask.run() 输出 Hello 字符串。
引用含有特定类型对象的实例方法
ClassB::instanceMethod 表示引用 ClassB 类的对象中的实例方法 instanceMethod,它与第二种方式很类似,只是它将对象实例换成了对象类型。
以下是一个示例代码:
public class MethodRefExample {
public void printHello() {
System.out.println("Hello");
}
public static void main(String[] args) {
Consumer<MethodRefExample> helloTask = MethodRefExample::printHello;
helloTask.accept(new MethodRefExample());
}
}
以上代码定义了一个 ConsumerMethodRefExample 类型的实例方法 printHello 作为实现方法赋值给这个对象,并在 main 方法中执行 helloTask.accept(new MethodRefExample()),输出 Hello 字符串。
引用构造函数
ClassB::new 表示引用 ClassB 类的构造函数,当 Lambda 表达式需要创建一个类的实例时,我们也可以使用方法引用来代替 Lambda 表达式。
以下是一个示例代码:
public class MethodRefExample {
public static void main(String[] args) {
Supplier<MethodRefExample> instanceSupplier = MethodRefExample::new;
MethodRefExample instance = instanceSupplier.get();
}
}
以上代码定义了一个 SupplierMethodRefExample 类的构造函数作为实现方法赋值给 instanceSupplier,并在 main 方法中执行 instanceSupplier.get() 创建一个 MethodRefExample 类的实例。
以上就是 Java 8 中方法引用的 4 种使用方法的详细说明。需要留意的是,Java8 中双冒号的使用在复杂应用中很有用,但在少量简单的情境下还是可以考虑采用羽毛球形式的 Lambda 表达式。
本文标题为:java8中:: 用法示例(JDK8双冒号用法)
基础教程推荐
- 详解直接访问WEB-INF目录下的JSP页面的方法 2023-08-01
- MyBatis实现批量插入方法实例 2023-06-24
- 利用Dojo和JSON建立无限级AJAX动态加载的功能模块树 2024-01-22
- jsp获取action传来的session和session清空以及判断 2023-12-24
- SpringMVC使用第三方组件实现文件上传 2024-01-16
- 关于MyBatis中映射对象关系的举例 2023-01-24
- java – 每当有任何新行或任何新更新时从Cassandra数据库中拉出来? 2023-11-01
- 一文搞懂Spring Security异常处理机制 2023-02-26
- java正则表达式匹配规则超详细总结 2023-06-06
- 关于两个BeanUtils.copyProperties()的用法及区别 2023-01-08
