java8中:: 用法示例(JDK8双冒号用法)

当我们在Java8中使用Lambda表达式(Functional Interface)时,我们通常使用双冒号(::)操作符来引用方法。这种方式也称为方法引用(Method Reference),它提高了程序的可读性和简化了代码。

与Lambda表达式类似,方法引用也需要和特定的Functional Interface搭配使用。在Java 8中,Java中提供了4种不同的方法引用类型,分别是:

  1. 引用静态方法,如:ClassB::staticMethod

  2. 引用含有特定对象实例方法的实例方法,如:obj::instanceMethod

  3. 引用含有特定类型对象的实例方法,如:ClassB::instanceMethod

  4. 引用构造函数,如: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());
    }
}

以上代码定义了一个 Consumer 类型的 helloTask 对象,将 MethodRefExample 类型的实例方法 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();
    }
}

以上代码定义了一个 Supplier 类型的 instanceSupplier 对象,将 MethodRefExample 类的构造函数作为实现方法赋值给 instanceSupplier,并在 main 方法中执行 instanceSupplier.get() 创建一个 MethodRefExample 类的实例。

以上就是 Java 8 中方法引用的 4 种使用方法的详细说明。需要留意的是,Java8 中双冒号的使用在复杂应用中很有用,但在少量简单的情境下还是可以考虑采用羽毛球形式的 Lambda 表达式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java8中:: 用法示例(JDK8双冒号用法) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 目前常用的在线格式化工具

    一、BeJson格式化工具 网址:在线JSON校验格式化工具(Be JSON) 优点:工具多 缺点:广告多,界面设计较旧,拼凑的工具网站,界面风格差异较大不统一。         二、Robots2开发工具箱 网址:Robots2开发工具网站 优点:工具界面风格统一,界面整洁,有日常开发用到的工具和网站导航 缺点:工具不是很全       三、sojson在…

    Java 2023年5月9日
    00
  • 快速搭建一个SpringBoot项目(纯小白搭建教程)

    让我以标准的markdown格式文本,详细讲解“快速搭建一个SpringBoot项目(纯小白搭建教程)”的完整攻略。 快速搭建一个SpringBoot项目(纯小白搭建教程) SpringBoot是一个快速构建基于Spring框架的应用程序的工具。它可以简化Java程序开发的复杂度,使得开发人员可以更加专注于业务逻辑的实现。在这里,我将为大家介绍如何简单快速地…

    Java 2023年5月15日
    00
  • JPA多数据源分布式事务处理方案

    JPA多数据源分布式事务处理方案需要涉及到以下几个步骤: 配置多数据源 配置事务管理器 编写跨数据源分布式事务代码 具体步骤如下: 配置多数据源 在Spring Boot应用程序中实现多个数据源的方法有很多,这里以使用HikariCP连接池的方式为例。首先在application.properties文件中配置两个数据源: # 第一个数据源 spring.d…

    Java 2023年5月20日
    00
  • JAVA中通过Hibernate-Validation进行参数验证

    下面是使用Hibernate-Validation进行参数验证的完整攻略。 1. 安装和配置 首先需要在项目中添加Hibernate-Validation的依赖,Maven坐标为:org.hibernate.validator:hibernate-validator:6.2.0.Final。 然后要在JavaBean类中添加注解以进行验证,例如: publi…

    Java 2023年5月19日
    00
  • 如何将默认的maven仓库改为阿里的maven仓库

    将默认的maven仓库改为阿里的maven仓库,需要在maven的settings.xml文件中进行配置。具体的步骤如下: 找到maven的settings.xml文件 在本地开发机上,maven的settings.xml文件一般位于maven安装目录的conf文件夹下。如果您使用的是IDEA等集成开发环境,则settings.xml文件可能位于IDEA安装…

    Java 2023年5月20日
    00
  • 详解SimpleDateFormat的线程安全问题与解决方案

    问题描述: SimpleDateFormat 是Java中用于格式化日期的类,它用来将给定的日期字符串转换为 Date 对象,或将 Date 对象格式化为指定格式的日期字符串。 然而,在多线程环境中使用 SimpleDateFormat 时,可能会出现线程不安全的问题,从而导致程序出错或结果不如预期。 问题原因: SimpleDateFormat 的实例不是…

    Java 2023年5月20日
    00
  • Java中File文件操作类的超详细使用教程

    Java中File文件操作类的超详细使用教程 简介 Java中的File类是文件和目录路径名的抽象表示。File类获取的是路径名的字符串,而不是文件内容。在Java中,我们可以使用File类来进行文件的操作。其中,常用的方法包括创建文件、删除文件、重命名文件、以及创建目录等操作。 创建文件 使用File类中的createNewFile方法可以创建一个文件。其…

    Java 2023年5月20日
    00
  • extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面

    下面是“extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面”的完整攻略。 1. 前置知识 在开始介绍本篇攻略之前,我们需要简单了解一下以下技术: Ext JS 3.31框架 JSON数据格式 如果您对以上知识不熟悉,我们建议您首先了解这些知识点,以便更好地理解本篇攻略。 2. 实现步骤 2.1 准备JSON数据 在实现“ex…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部