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;
相关推荐
惊讶的猫7 分钟前
意图识别置信度和检索重排的分数
java
2601_9669496525 分钟前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
caoerzhong30 分钟前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
m0_7345717636 分钟前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
程序员JerrySUN1 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
Joy T2 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者2 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
RAN11426760082 小时前
1.3第一个程序的介绍
开发语言·qt
天若有情6732 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
blue_ice .3 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发