当前位置: 首页 > news >正文

【后端】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.lryc.cn/news/615782.html

相关文章:

  • 【东枫科技】NTN-IOT 卫星互联网原型系统,高达1.6G大带宽
  • MPLS特性之PHP(Penultimate Hop Popping)
  • Android快速视频解码抽帧FFmpegMediaMetadataRetriever,Kotlin(2)
  • 【软考中级网络工程师】知识点之 DCC 深度剖析
  • 【21】OpenCV C++实战篇——OpenCV C++案例实战二十七《角度测量》
  • Perplexity 为特朗普 Truth Social 提供技术支持
  • 如何培养自己工程化的能力(python项目)
  • Pytorch深度学习框架实战教程12:Pytorch混合精度推理,性能加速147%的技术实现
  • 若依前后端分离版学习笔记(八)——事务简介与使用
  • Apache Pulsar性能与可用性优化实践指南
  • NLP---IF-IDF案例分析
  • C++高频知识点(十九)
  • 【面试场景题】异地多活改造方案
  • 【Matplotlib】中文显示问题
  • 【论文阅读】Deep Adversarial Multi-view Clustering Network
  • Docker 镜像常见标签(如 `标准`、`slim`、`alpine` 和 `noble`)详细对比
  • 随想记——excel报表
  • Linux下的软件编程——标准IO
  • 编程基础之多维数组——矩阵交换行
  • `sk_buff` 结构体详解(包含全生命周期解析)
  • 如何回收内存对象,有哪些回收算法?
  • XML 指南
  • LeetCode_字符串
  • Jenkins | 账号及权限管理
  • Pytorch深度学习框架实战教程-番外篇02-Pytorch池化层概念定义、工作原理和作用
  • 怎么能更好的降低论文AI率呢?
  • 分布微服务电商订单系统Rust编码开发[下]
  • SpringBoot学习日记(三)
  • 【C++/STL】list模拟实现和迭代器失效问题
  • 基于 RabbitMQ 死信队列+TTL 实现延迟消息+延迟插件基本使用