当前位置: 首页 > 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.dtcms.com/a/324096.html

相关文章:

  • Linux常用命令(后端开发版)
  • SQL(结构化查询语言)的四大核心分类
  • 【后端】Java 8 特性 Optional 可选类 介绍
  • Oracle 19C 查看卡慢的解决思路
  • Spring Boot整合knife4j实战
  • iceberg安装部署
  • imx6ull支持4G模块
  • C++高频知识点(十八)
  • 生产环境中Spring Cloud Sleuth与Zipkin分布式链路追踪实战经验分享
  • 咪咕MGV3200-KLH_GK6323V100C_板号E503744_安卓9_短接强刷包-可救砖
  • uni-app 网络请求终极选型:uni.request、axios、uni-network、alova 谁才是你的真命请求库?
  • CD64.【C++ Dev】多态(3): 反汇编剖析单继承下的虚函数表
  • CPP继承
  • Qt—— 下载、工具介绍以及新建项目
  • 机器学习 [白板推导](八)[EM算法]
  • 机器学习-----K-means算法介绍
  • 打靶日常-XSS(反射型和存储型)
  • UE材质World Position 和 Object Position
  • 第十章:发布与展望 —— 让你的作品在 Edge 中闪耀
  • 力扣(买卖股票的最佳时机I/II)
  • 苍穹外卖-Day1 | 环境搭建、nginx、git、令牌、登录加密、接口文档、Swagger
  • 九、Linux Shell脚本:运算符与表达式
  • 在Ansys Simplorer中设计三相逆变器,并与Maxwell FEA耦合,实现160kW PMSM
  • AI浏览器与传统爬虫范式的技术冲突:重构互联网信息获取的伦理与实践
  • JVM调优好用的内存分析工具!
  • PHP版本控制系统:高效文档管理
  • 精准计算Word文档页数的PHP类
  • 【Redis】持久化方案——RDB和AOF
  • 5Python异常处理与模块导入全指南
  • nginx 反向代理传递原始域名