156. Java Lambda 表达式 - 从 Lambda 到方法引用:深入理解 Java 的未绑定实例方法调用

156. Java Lambda 表达式 - 从 Lambda 到方法引用:深入理解 Java 的未绑定实例方法调用

未绑定的方法引用 是指引用一个实例方法。不同于静态方法引用,未绑定方法引用没有显式的类名,它是对对象实例方法的引用。通过方法引用,你可以简化那些常见的、重复的 lambda 表达式,提升代码的可读性和简洁性。

1. 未绑定的方法引用概述

未绑定的方法引用通常用于类的实例方法。这意味着我们引用的是某个对象的实例方法,而不是类本身的静态方法。

一般语法:

java 复制代码
RefType::instanceMethod

其中,RefType 是类的类型,instanceMethod 是实例方法的名称。

2. 引用无参数的实例方法

假设你有一个 lambda 表达式,目的是获取字符串的长度:

java 复制代码
Function<String, Integer> toLength = s -> s.length();

这段代码可以被简化为引用 String 类的实例方法 length(),如下所示:

java 复制代码
Function<String, Integer> toLength = String::length;

这个例子中,String::length 就是对 String 类的实例方法 length() 的引用。虽然看起来像是一个静态方法的调用,但它实际上引用的是一个实例方法。你可以通过对象实例来调用它,比如:

java 复制代码
String word = "Hello";
int length = word.length();  // 调用实例方法
3. 引用实例的 getter 方法

未绑定方法引用常用于调用 JavaBeangetter 方法。例如,如果你有一个 User 类,里面有一个 getName() 方法,你可以使用未绑定方法引用来简化代码。

假设 User 类如下:

java 复制代码
public class User {
    private String name;

    public String getName() {
        return name;
    }
}

你可以将以下的 lambda 表达式:

java 复制代码
Function<User, String> getName = user -> user.getName();

替换成方法引用:

java 复制代码
Function<User, String> getName = User::getName;

这里,User::getName 就是对 User 类的实例方法 getName() 的引用。通过方法引用,你能够简化获取属性的操作。

4. 引用带有多个参数的实例方法

未绑定方法引用也可以引用带有多个参数的实例方法。例如,如果你有一个 BiFunction,它接受两个字符串,并且调用 String 类的 indexOf() 方法来查找一个字符串的位置:

使用 lambda 表达式:

java 复制代码
BiFunction<String, String, Integer> indexOf = (sentence, word) -> sentence.indexOf(word);

这段代码可以用未绑定的方法引用简化为:

java 复制代码
BiFunction<String, String, Integer> indexOf = String::indexOf;

这里,String::indexOf 就是引用 String 类的实例方法 indexOf(),它接受两个参数:sentenceword,返回 wordsentence 中出现的位置。

5. 总结未绑定的方法引用

未绑定的方法引用是指引用类的实例方法,不同于静态方法引用,它是通过类的对象实例来调用的方法。通常情况下,它可以简化 lambda 表达式,提升代码的可读性。

常见用法:

  • 引用实例方法,如 String::lengthUser::getName
  • 引用带有多个参数的方法,如 String::indexOf

练习

  1. 将以下的 lambda 表达式用未绑定的方法引用替代:

    java 复制代码
    Function<String, String> toUpperCase = s -> s.toUpperCase();

    答案:

    java 复制代码

Function<String, String> toUpperCase = String::toUpperCase;

vbnet 复制代码
2. 将以下的 lambda 表达式用未绑定的方法引用替代:

```java
BiFunction<String, String, Integer> compare = (s1, s2) -> s1.compareTo(s2);

答案:

java 复制代码
BiFunction<String, String, Integer> compare = String::compareTo;

通过这些练习,你可以更好地理解未绑定的方法引用,并在适当的场景中使用它们以简化代码。

相关推荐
李日灐12 小时前
< 6 > Linux 自动化构建工具:makefile 详解 + 进度条实战小项目
linux·运维·服务器·后端·自动化·进度条·makefile
蝎子莱莱爱打怪12 小时前
小孩儿才做选择!Hermes 和OpenClaw 我都要!
人工智能·后端·github
直奔標竿12 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
枫叶林FYL13 小时前
项目八 云资源成本优化与治理平台
后端·python·自然语言处理·flask
Championship.23.2413 小时前
Open Source Pipeline Skill深度解析:自动化开源贡献全流程
前端·javascript·html
Bigger13 小时前
🧠 前端岗位的"结构性调整":现象背后的冷思考
前端·程序员·ai编程
薯老板13 小时前
vue组件之间的通信
前端·vue.js
迪菲赫尔曼13 小时前
从 0 到 1 打造工业级推理控制台:UltraConsole(Ultralytics + FastAPI + React)开源啦!
前端·yolo·react.js·计算机视觉·开源·fastapi
万邦科技Lafite13 小时前
京东开放API接口:item_get返回参数指南
java·前端·javascript·api·电商开放平台
梦想CAD控件13 小时前
网页CAD协同设计平台-生产级在线实时协同CAD引擎
前端·javascript·架构