【后端】Java 8 特性 `User::getId` 语法(方法引用)介绍

文章目录

        • 核心概念解析:
        • 方法引用的四种类型:
        • 关键特性:
        • 使用场景推荐:
        • 何时避免使用:
        • 性能说明:

在 Java 中, User::getId 是一种称为 方法引用(Method Reference) 的语法糖,它本质上是一个简化版的 Lambda 表达式,专门用于引用现有的方法。

核心概念解析:
  1. 方法引用是什么?

    • 一种更简洁的 Lambda 表达式写法
    • 语法:ClassName::methodName
    • 底层等同于:(参数) -> ClassName.methodName(参数)
  2. User::getId 具体含义:

    // 两者完全等价:
    Collectors.groupingBy(User::getId)// 原始 Lambda 形式
    Collectors.groupingBy(user -> user.getId())
    
  3. 执行机制:

    • Stream 遍历每个 User 对象
    • 调用该对象的 getId() 方法
    • 将返回值用作分组依据
    // 伪代码实现逻辑
    Map<Long, List<User>> map = new HashMap<>();
    for (User user : userList) {Long id = user.getId();  // 这就是 User::getId 实际执行的操作map.computeIfAbsent(id, k -> new ArrayList<>()).add(user);
    }
    
方法引用的四种类型:
类型语法等价 Lambda示例
1. 静态方法引用Class::staticMethod(args) -> Class.staticMethod(args)Math::sqrt
2. 实例方法引用Class::instanceMethod(obj, args) -> obj.instanceMethod(args)User::getId
3. 特定对象方法引用object::instanceMethod(args) -> object.instanceMethod(args)System.out::println
4. 构造器引用Class::new(args) -> new Class(args)ArrayList::new

User::getId 属于第二种类型:实例方法引用(无参数)

关键特性:
  • 类型推断:编译器自动推断参数类型为 User

  • 空指针风险:若 usernull 会抛出 NPE

  • 方法匹配要求:要求方法签名匹配函数式接口

    // groupingBy 需要 Function 接口
    public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier)
    

    此处 User::getId 匹配为:

    Function<User, Long> classifier = User::getId;
    
使用场景推荐:
  1. 集合操作:list.stream().map(User::getName)
  2. 排序:Collections.sort(users, Comparator.comparing(User::getBirthDate))
  3. 替代简单 Lambda:当仅调用单个方法时优先使用方法引用
何时避免使用:
// 需要额外操作时不适用:
users.stream().map(user -> {log.debug("Processing user: {}", user); return user.getId();})  // 需要多行操作,不能简化为方法引用// 需要空值检查:
users.stream().map(user -> user != null ? user.getId() : null)  // 无法用方法引用表达
性能说明:
  • 编译后与 Lambda 表达式生成相同字节码
  • 无运行时性能差异
  • 本质是编译器提供的语法糖

💡 专业提示:在 IntelliJ IDEA 中,可使用 Alt+Enter 在 Lambda 和方法引用之间自动转换。

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

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

相关文章

基于BP与CNN的图像分类模型构建、超参数优化及性能对比研究​

一、实验目的实验目标构建基于神经网络模型的数据分析与模式识别框架&#xff0c;探明神经网络在大数据分析中的意义。实验任务构建基于深度 BP 神经网络与卷积神经网络的数据分析与模式识别框架&#xff0c;将数据集 MNIST 与 CIFAR-10 分别在两种模型中训练&#xff0c;并比较…

HarmonyOS应用开发-低代码开发登录页面(超详细)

本篇文章我来手把手教大家做一个HarmonyOS 应用的登录页面&#xff0c;逐步讲解&#xff0c;非常细致&#xff0c;百分百能学会&#xff0c;并提供全部源码。页面使用 DevEco Studio 的低代码开发。 通过本文的实践经验&#xff0c;我想告诉大家&#xff0c; HarmonyOS 应用开发…

AJAX与axios框架

文章目录前言案例跨域访问总结❗前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 通过 ajax 进行前后端交互 案例 此项目用到了javaweb知识 首先创建JavaWeb项目编写代码&#xff1a; package ajax;import java.io.IOException; import java.util.Arr…

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册&#xff1a;算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳目录《医学统计学从入门到…

Python设计模式 - 装饰模式

定义 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;用于在不修改原有类的情况下动态地扩展对象的功能。 结构抽象组件&#xff08;Component&#xff09;&#xff1a;定义对象的公共接口&#xff0c;使得客户端能以一致的方式处理未被装…

MySQL(188)如何使用MySQL的慢查询工具?

使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询。以下是详细深入的步骤和代码示例&#xff0c;帮助你使用MySQL的慢查询工具来进行查询分析和优化。 一、启用慢查询日志 首先&#xff0c;你需要确保MySQL的慢查询日志功能是启用的。慢查询日志记录了所有执行…

如何培养自己工程化的能力(python项目)

培养 Python 项目的工程化能力需要系统性训练&#xff0c;以下从基础到高阶的实践路径&#xff0c;结合具体案例和工具链&#xff0c;帮助你逐步进阶&#xff1a;一、夯实工程化基础能力​1. 规范代码与项目结构•​项目模板化​使用 cookiecutter生成标准项目结构&#xff0c;…

AI编程插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功能特性、性能表现、集成性、用户…

uniapp/uniappx实现图片或视频文件选择时同步告知权限申请目的解决华为等应用市场上架审核问题

在UNIAPP支持vue和nvue,在UNIAPPX支持uvue&#xff0c;安卓支持在选择图片或视频文件权限申请的时候自动同步告知权限申请目的。轻松解决在华为应用市场审核&#xff0c;要求告知权限申请目的或说明的问题。 UNIAPP相册图片视频选择器(安卓可以自定义界面样式)功能介绍&#x…

jupyter notebook如何打开其他盘目录

问题描述Jupyter Notebook 相信是我们学习 Python 避不开的一个工具。当我们使用 pip install notebook 安装 Notebook 之后&#xff0c;使用命令 jupyter notebook 启动服务&#xff0c;启动之后默认会在浏览器打开界面。我们会发现&#xff0c;这个界面默认在 C 盘下&#xf…

C语言深度剖析

一、关键字 1.1 最快的关键字-register register 这个关键字请求编译器尽可能将变量存在CPU内部寄存器中,而不是通过内存寻址以提高效率。 注意是:尽可能、而不是绝对 1.1.1 皇帝身边的小太监-寄存器 不知道什么是寄存器,那见过太监没有其实寄存器就是相当于。一个cpu的…

电脑使用“碎片整理”程序的作用

1.解决文件碎片化问题碎片整理的作用&#xff1a;将这些分散的文件片段重新整理、拼接&#xff0c;使其连续存储在硬盘的某个区域&#xff0c;减少文件的 “碎片化” 程度。2. 提升硬盘读写速度机械硬盘的特殊性&#xff1a;机械硬盘依赖磁头的物理移动来读取数据&#xff0c;若…

AI 软件工程开发 AI 算法 架构与业务

AI 软件工程开发 & AI 算法 & 架构与业务前言1.AI 软件工程开发1.1. AI Developer Studio &#xff08;playground级&#xff09;1.2. Agent & RAG1.3. LangChain & LangGraph1.4. MCP, Model Context Protocol1.5. Ollama1.6. Coze & Dify2.AI 算法2.1. G…

uniapp实现的圆形滚盘组件模板

采用 uniapp 实现的一款圆形滚盘示例组件模板, 支持 vue2、vue3&#xff0c;适配H5、微信小程序&#xff08;其他小程序未试过&#xff0c;可自行尝试&#xff09; 代码实现简约易懂&#xff0c;用户可根据自身需求下载模板&#xff0c;并进行扩展开发可到插件市场下载尝试&…

无须炮解,打开即是Pro版

聊一聊 文档或文件转图片&#xff0c;这个我有段时间没有推荐了。 今天发现了一款非常好用的图像格式转换编辑软件。 有需要的小伙伴请及时收藏&#xff0c;防止下次找不到。 软件介绍 全能图像格式转换工具 这是一款全能的图像转换软件&#xff0c;支持几乎所有的图像格式…

企业高性能web服务器——Nginx

Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个邮件代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发&#xff0c;官方测试nginx能够支撑5万并发链接&#xff0c;并且cpu、内存等资源消耗却非常低&#xff0c;运行非常稳定。所以其特点是占有内存…

MCU控制ADAU1701,用System Workbench for STM32导入工程

作者的话 MCU控制ADAU1701&#xff0c;我有写一个文档详细讲步骤&#xff0c;里头用到了System Workbench for STM32这个软件&#xff0c;他是基于eclips内核的开发软件&#xff0c;一般来讲&#xff0c;设置好workspce工程就会出来&#xff0c;但是架不住就有设置好工程不出来…

SQL176 每个题目和每份试卷被作答的人数和次数

描述现有试卷作答记录表exam_record&#xff08;uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分&#xff09;&#xff1a;iduidexam_idstart_timesubmit_timescore1100190012021-09-01 09:01:012021-09-01 09:41:01812100290022021-09-01 …

构建第三方软件仓库

1 下载第三方软件到指定目录[rootServer_b ~]# mkdir software [rootServer_b software]# wget https://dldir1v6.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.18_250724_x86_64_01.rpm2 安装软件信息采集工具[rootServer_b software]# yum install createrepo -y [rootServer_b softw…

Linux 管道命令及相关命令练习与 Shell 编程、Tomcat 安装

2.实验目的掌握 Linux 管道命令及相关命令&#xff08;cut、sort、wc、uniq、tee、tr、split&#xff09;的使用方法。学会使用 Shell 编程实现基本的计算器功能。掌握在 CentOS 7 系统中安装 Tomcat 的方法。实验内容1. Linux 管道命令及相关命令练习1.1 管道命令定义&#xf…