java关于引用

引用定义

把已经有的方法拿过来用,可以简化Lambda 表达式。分为静态方法引用、成员方法、构造方法、类名引用

使用说明

  • 引用处必须是函数式接口
  • 被引用的方法必须已经存在
  • 被引用方法的形参和返回值需要跟抽象方法保持一致
  • 被引用方法的功能要满足当前需求

引用静态方法

**格式:**类名::静态方法

**范例:**Integer::parseInt

对比

java 复制代码
// Lambda写法
Function<String, Integer> f = s -> Integer.parseInt(s);
// 静态方法引用
Function<String, Integer> f = Integer::parseInt;

引用成员方法

分为其他类、本类、父类

引用其他类的成员方法

**格式:**对象::成员方法

对比

java 复制代码
// Lambda写法
Consumer<String> c = s -> System.out.println(s);
// 静态方法引用
Consumer<String> c = System.out::println;

引用本类的成员方法

**格式:**this::方法名

对比

java 复制代码
public class Demo {

    public void show(String s) {
        System.out.println(s);
    }

    public void test() {

        // Lambda 写法
        Consumer<String> c1 = s -> this.show(s);

        // 方法引用写法
        Consumer<String> c2 = this::show;

        c2.accept("Hello");
    }
}

引用父类的成员方法

**格式:**super::方法名

对比

java 复制代码
class Father {
    public void print(String s) {
        System.out.println("Father: " + s);
    }
}

class Son extends Father {

    public void test() {

        // Lambda 写法
        Consumer<String> c1 = s -> super.print(s);

        // 方法引用写法
        Consumer<String> c2 = super::print;

        c2.accept("hello");
    }
}

引用构造方法

**格式:**类名::new

**范例:**ArrayList::new

对比

java 复制代码
// Lambda写法
Supplier<List<String>> s = () -> new ArrayList<>();
// 静态方法引用
Supplier<List<String>> s = ArrayList::new;

其他

使用类名引用成员方法

格式:类名::成员方法

范例:String::substring

对比

java 复制代码
// Lambda写法
BiFunction<String, Integer, String> f = (s, i) -> s.substring(i);
// 静态方法引用
BiFunction<String, Integer, String> f = String::substring;

说明

第一个参数

表示被引用方法的调用者

决定了可以引用哪些类中的方法,换句话说Lambda 的第一个参数类型必须与方法所在类匹配

第二个参数及以后

对应被引用方法的参数列表

如果方法没有参数,那么 Lambda 里除了第一个参数之外就没有其他参数

局限性

不能引用任意类中的任意方法

只能引用第一个参数类型所对应类中的实例方法

方法参数和抽象方法参数必须一一对应

引用数组构造方法

**格式:**数据类型[]::new

**范例:**int[]::new

对比

java 复制代码
// Lambda写法
Function<Integer, int[]> f = length -> new int[length];
// 静态方法引用
Function<Integer, int[]> f = int[]::new;
相关推荐
.柒宇.6 分钟前
FastAPI 基础指南:从入门到实战
开发语言·python·fastapi
xyq202412 分钟前
Go 错误处理
开发语言
JAVA面经实录91720 分钟前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
Drug24 分钟前
Struts2 从入门到放弃?不,这些核心知识你依然需要掌握
java
Slow菜鸟31 分钟前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能
lsx20240632 分钟前
Julia 基本运算符
开发语言
月落归舟40 分钟前
java基础之拷贝、单例
java·单例·拷贝
鬼蛟44 分钟前
什么是 Git
java
2501_921649491 小时前
企业定制金融数据 API:从架构设计到 Python 接入实战
大数据·开发语言·python·websocket·金融·量化
直奔標竿1 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring