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;
相关推荐
小小码农Come on2 小时前
QT布局介绍
开发语言·qt
晚风吹长发2 小时前
初步了解Linux中的线程概率及线程控制
linux·运维·服务器·开发语言·c++·centos·线程
弹简特2 小时前
【JavaEE04-后端部分】Maven 小介绍:Java 开发的构建利器基础
java·maven
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于python网络安全知识在线答题系统为例,包含答辩的问题和答案
开发语言·python·web安全
wjs20242 小时前
PHP Misc
开发语言
Highcharts.js2 小时前
Next.js 集成 Highcharts 官网文档说明(2025 新版)
开发语言·前端·javascript·react.js·开发文档·next.js·highcharts
CodeByV2 小时前
【Qt】信号与槽
开发语言·qt
爱学习的阿磊2 小时前
模板代码跨编译器兼容
开发语言·c++·算法
带鱼吃猫2 小时前
C++STL:从 0 到 1 手写 C++ string以及高频易错点复盘
开发语言·c++