【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

news2024/11/8 23:46:17

Java高级语法详解之方法引用

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
    • 3.1 语法形式
    • 3.2 案例
  • 4️⃣ 应用场景
  • 5️⃣ 注意事项
  • 🌾 总结

在这里插入图片描述

1️⃣ 概念

方法引用是Java编程语言中的一个重要特性,它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambda表达式的代码,使代码更加清晰、简洁。

方法引用是通过名称引用一个现有的方法来代替Lambda表达式的一种方式。它允许将方法本身作为一个对象传递或存储,并能够在需要时进行调用。方法引用可以看作是一种函数指针,它指向了一个已经存在的方法。

2️⃣ 优势和缺点

优点:

  • 简化代码:方法引用可以将一些复杂的Lambda表达式转化为简洁明了的代码;
  • 提高代码的复用性:通过方法引用,我们可以重复使用已经存在的方法,而无需重复编写相同的代码。

缺点:

  • 可读性限制:某些情况下,过多的方法引用可能会降低代码的可读性,特别是当方法名并不直观或者存在多个参数的情况下;
  • 局限性:方法引用只能用于引用非静态方法、静态方法和构造方法,对于其他情况则无法使用。

3️⃣ 使用

3.1 语法形式

Java的方法引用有以下四种使用形式:

  1. 静态方法引用(Static Method Reference):使用类名和双冒号(::)来引用一个静态方法。例如,Math::max表示引用Math类中的静态max方法。

    类名::静态方法名称
    
  2. 实例方法引用(Instance Method Reference):使用实例对象和双冒号(::)来引用一个非静态的实例方法。例如,String::length表示引用String对象的length方法。

    实例对象::方法名称
    
  3. 构造方法引用(Constructor Method Reference):使用类名和关键字new来引用一个构造方法。例如,ArrayList::new表示引用ArrayList类的构造方法。

    类名::new
    
  4. 引用特定类型的任意对象的实例方法(Reference to an Instance Method of a Particular Object):使用特定对象的实例和双冒号(::)来引用该对象的实例方法。例如,myObject::methodName表示引用myObject对象的methodName方法。

    特定类实例对象::方法名称
    

3.2 案例

以下是一个示例Java程序,演示了Java方法引用的四种使用形式:

import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

class Vehicle {
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    // 静态方法
    public static void printName(String name) {
        System.out.println(name);
    }

    // 实例方法
    public void printPowerValue(Long powerValue) {
        System.out.println(powerValue);
    }

    @Override
    public String toString() {
        return "Vehicle{" +
                "type='" + type + '\'' +
                '}';
    }
}

public class MethodReferenceExample {

    public static void main(String[] args) {
        // 静态方法引用: 类名::静态方法
        List<String> names = Arrays.asList("擎天柱", "霸天虎", "威震天");
        names.forEach(Vehicle::printName);
        System.out.println();

        // 实例方法引用: 对象名::实例方法
        Vehicle example = new Vehicle();
        List<Long> messages = Arrays.asList(50000L, 120000L);
        messages.forEach(example::printPowerValue);
        System.out.println();

        // 构造方法引用: 类名::new
        Supplier<Vehicle> vehicleSupplier = Vehicle::new;
        // 创建对象
        Vehicle car = vehicleSupplier.get();
        car.setType("Car");
        Vehicle bike = vehicleSupplier.get();
        bike.setType("Bike");
        // 打印对象
        System.out.println(car);
        System.out.println(bike);
        System.out.println();

        // 引用特定类型的任意对象的实例方法: 对象名::实例方法
        String prefix = "Prefix:";
        List<String> suffixes = Arrays.asList("A", "B", "C");
        suffixes.stream()
                .map(prefix::concat) // 使用String的concat方法
                .forEach(System.out::println); // 使用System.out的println方法
    }
}

在这个示例中,我们使用了静态方法引用、实例方法引用、构造方法引用和引用特定类型的任意对象的实例方法。通过运行这个程序,可以看到各个方法引用形式的使用效果。

运行结果:

擎天柱
霸天虎
威震天

50000
120000

Vehicle{type='Car'}
Vehicle{type='Bike'}

Prefix:A
Prefix:B
Prefix:C

4️⃣ 应用场景

方法引用广泛应用于函数式编程、Stream API和Lambda表达式等方面,特别在以下几个场景中被普遍使用:

1. 集合操作:在集合的排序、筛选、映射等操作时,可以使用方法引用简化代码;
2. GUI编程:在事件处理、回调函数等方面,通过方法引用来实现事件的响应机制;
3. 数据处理:在对数据进行加工、处理和计算时,方法引用常用于替代复杂的Lambda表达式。

5️⃣ 注意事项

在使用方法引用时,有一些注意事项需要考虑:

  1. 方法引用只能用于函数式接口:方法引用只能用于那些只有一个抽象方法的接口,也就是函数接口。确保在使用方法引用时,目标类型是一个函数接口,否则编译将会失败。

  2. 参数匹配:方法引用的参数必须与目标方法的参数列表兼容。这意味着参数数量和类型要一致。如果目标方法具有多个参数,可以通过上下文推断或者函数式接口的泛型来进行类型匹配。

  3. 方法引用可能引发空指针异常:在使用实例方法引用时,请确保对象引用不是null。否则,在调用实例方法时会引发空指针异常。因此,在进行实例方法引用操作前,请先对对象进行必要的空值检查。

  4. 正确使用方法引用,增加代码可读性:正确使用方法引用可以使代码更加简洁、清晰和易于理解。然而,过度使用方法引用可能会导致代码难以阅读和维护。请在合适的情况下使用方法引用,并在需要更明确的表达时使用传统的Lambda表达式(或匿名类)来代替。

  5. 选择最适合的方法引用方式:熟悉各种方法引用的不同形式,包括静态方法引用、实例方法引用、构造方法引用和引用特定类型的任意对象的实例方法。了解这些不同的使用形式,可以根据具体的编码需求选择最适合的方法引用方式。

  6. 方法引用与Lambda表达式的比较:在某些情况下,方法引用可以代替Lambda表达式来提高代码可读性。然而,并非所有情况都适合使用方法引用。有时,使用Lambda表达式可能更清晰明了。

在使用方法引用时,请遵循上述注意事项,以确保正确且有效地应用方法引用,以及使代码更加简洁、可读和易于维护。

🌾 总结

总之,方法引用是Java编程语言中的一个重要特性,它能够简化代码、提高可读性和复用性。通过灵活应用方法引用,可以使代码更加清晰、简洁,并减少开发的工作量。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【博客675】prometheus生产上易犯的错误

prometheus生产上易犯的错误 Mistake 1: Cardinality bombs 这是每个人在开始使用 Prometheus 时至少会遇到一次的经典陷阱。一旦您发现 Prometheus 基于标签的数据模型的有用性&#xff0c;您可能会想按各种有用的标签维度来拆分指标&#xff0c;直到您创建的时间序列超出 P…

【QT】枚举用到的宏详解:Q_ENUM,Q_FLAG,Q_DECLARE_FLAGS,Q_DECLARE_OPERATORS_FOR_FLAGS

目录 1. Q_ENUM宏 与 QMetaEnum类1.1 Q_ENUM宏的作用1.2 使用Q_ENUM注意的问题1.3 在写有关枚举的代码时&#xff0c;我们可能遇到这种情况&#xff1a;需要用到枚举的字符串&#xff0c;该怎么办&#xff1f;1.4 下面通过一段简单的代码来说明Q_ENUM的作用 2. Q_FLAG宏2.1 Q_F…

【SpringMVC】| 拦截器(含源码分析)

目录 拦截器 1. 拦截器的介绍 2. 拦截器的三个抽象方法 3. 拦截器的使用 4. 多个拦截器的执行顺序 Java核心技术大会 文末福利&#xff08;Java核心技术卷&#xff09; 拦截器 拦截器能拦截请求&#xff0c;前面学习的过滤器也能拦截请求&#xff0c;那两者有什么区别…

【数据结构与算法C++实现】1、异或的用法

原视频为左程云的B站教学 文章目录 1 异或换值2 求出数组中唯一一个出现奇数次的数3 求出数组中的两个出现奇数次的数 异或&#xff1a; 相同为0&#xff0c;不同为1。 更好的记忆方式&#xff1a; 不进位相加 10010 ^ 01100--------11110性质 0 ^ N N&#xff0c;N ^ N 0…

广电用户画像分析之根据用户行为数据进行筛选与标签添加

在数据处理和分析领域&#xff0c;我们经常需要根据用户的行为数据进行筛选和标签添加&#xff0c;以便更好地理解用户行为和偏好。在本篇博客中&#xff0c;我们将介绍两个示例&#xff0c;展示如何根据用户的收视行为数据和订单信息进行数据处理和分析。 前情提要&#xff1…

创新型影像测量仪器有哪些

走新型工业化之路&#xff0c;加快重塑竞争新优势&#xff0c;离不开更强的创新能力、更高的创新效率。新型工业化道路的基本标志和落脚点是要做到“科技含量高、经济效益好、资源消耗低、环境污染少、人力资源优势得到充分发挥”&#xff0c;并实现这几方面的兼顾和统一。而不…

spring boot 项目实现打包依赖分离

spring boot version 2.7 &#xff08;理论上是通用的&#xff09;Maven version 3 打包结果 重要文件以及文件夹解释 lib: 存在当前项目的全部依赖 other&#xff1a;和当前项目的 groupID 不同的依赖 project&#xff1a;和当前项目groupID 相同的依赖 XX-3.0.0-SNAPSHOT.j…

jdk安装及配置

一、下载安装包&#xff1a; 阿里云盘分享 提取码&#xff1a;am66 双击该程序 点击下一步 稍作等待即可。 二、配置环境变量 再新建一个系统变量CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 找到Path变量&#xff0c;双击编辑 Path变量。点击新建&…

【深度学习】GPT-2

在GPT1问世不久&#xff0c;和GPT很相似的BERT横空出世&#xff0c;并且在各方面都超越GPT-1。OpenAI在《Language Models are Unsupervised Multitask Learners》中于2019年提出的GPT-2&#xff0c;全称为Generative Pre-Training 2.0。提出语言模型式无监督的多任务学习 &…

DDS 信号发生器实验

目录 DDS 信号发生器实验 1、DDS 简介 2、实验任务 3、程序设计 3.1、DDS 顶层模块代码 3.2、clk_wiz IP 核 3.3、ILA IP 核&#xff08;集成逻辑分析器&#xff1a;Integrated Logic Analyzer&#xff0c;ILA&#xff09; 3.4、各波形参考代码 3.4.1、正弦信号波形采…

身份识别与访问管理(IAM)工具

AD360 是一款企业 IAM 解决方案&#xff0c;可帮助管理身份、保护访问并确保合规性。它具有强大的功能&#xff0c;例如自动化身份生命周期管理、安全 SSO、自适应 MFA、基于审批的工作流、UBA 驱动的身份威胁防护和历史审计报告。AD360 直观的界面和强大的功能使其成为满足现代…

行业云统领2023十大技术趋势,新华三把脉数实融合演进路径

“每一年的科技突破与环境变局&#xff0c;有一定的随机性又有一定的必然性&#xff0c;导致人类社会永远处于动态塑形的过程。”中国工程院院士陈晓红在想像未来的技术变化时认为&#xff1a;“无论怎么变化&#xff0c;人类未来图景仍然源于社会生活与经济发展的真实需求”。…

了解MySQL配置文件:位置、结构和选项

目录 1 MySQL配置文件的位置2 MySQL配置文件的结构3 MySQL配置选项4 [mysqld]部分&#xff1a;5 [client]部分&#xff1a;6 MySQL配置文件的重要性7 总结 本文详细介绍了MySQL配置文件的位置、结构和常用选项。了解如何使用MySQL配置文件来管理和配置MySQL服务器的行为和属性。…

5. QT环境下使用OPenCV(基于TCP实现摄像头图像数据的多线程传输)

1. 说明 通常情况下对于图像数据的采集可以放在后端进行,采集到的图像数据如果有需要可以通过通信将数据传输到前端进行显示,这其中需要使用到TCP数据传输协议和QT下的多线程开发技术。QT当中主线程一般是界面层次的,在主线程中执行耗时较长的数据操作,会引起界面的卡顿,…

React学习9 Router6

使用 userRoutes路由表 注册路由 Outlet指定路由组件呈现位置 ***很重要&#xff0c;userNavigate()实现编程式路由导航 函数式组件接收params参数的hook useParams() 接受search参数 接收state参数 userNavigate 实现前进后退 判断是否处于路由组件中&#xff0c;在路由器管理…

网站加密防止拷贝的php域名授权方法

1 public function getdata()2 $method DES-ECB;//加密方法3 $passwd qq496631085;//加密密钥4 $options 0;//数据格式选项&#xff08;可选&#xff09;5 $iv ;//加密初始化向量&#xff08;可选&#xff09;6 $url ba…

双因素身份验证在远程访问中的重要性

在快速发展的数字环境中&#xff0c;远程访问计算机和其他设备已成为企业运营的必要条件。无论是在家庭办公室运营的小型初创公司&#xff0c;还是团队分散在全球各地的跨国公司&#xff0c;远程访问解决方案都能保证工作效率和连接性&#xff0c;能够跨越距离和时间的阻碍。 …

MQTT(二)Java整合MQTT

Java整合MQTT 上一节知道MQTT是一个通信协议&#xff0c;需要一个代理服务Broker&#xff1b;通信设备作为客户端Client&#xff0c;后台系统服务器也作为客户端Client。 经过了解选用EMQX作为代理服务Broker&#xff08;支持WEB界面查看&#xff09; 后台服务使用Spring In…

【教学类-36-01】Midjounery生成的四张图片切片成四张小图

作品展示&#xff1a; 把一张正方形图片的四个等大小图切割成四张图片 背景需求 最近在学习ChatGPT的绘画&#xff08;midjounery AI艺术&#xff09; 我想给中班孩子找卡通动物图片&#xff08;黑白线条&#xff09;&#xff0c;打印下来&#xff0c;孩子们练习描边、涂色…

【发布】ChatGLM2-6B:性能大幅提升,8-32k上下文,推理提速42%

自3月14日发布以来&#xff0c; ChatGLM-6B 深受广大开发者喜爱&#xff0c;截至 6 月24日&#xff0c;来自 Huggingface 上的下载量已经超过 300w。 为了更进一步促进大模型开源社区的发展&#xff0c;我们再次升级 ChatGLM-6B&#xff0c;发布 ChatGLM2-6B 。 在主要评估LLM模…