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;
相关推荐
Flittly3 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了3 小时前
Java 生成二维码解决方案
java·后端
人活一口气8 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP10 小时前
Vibe Coding -- 完整项目案例实操
java
荣码10 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing10 小时前
Google第三方授权登录
java·后端·程序员
明月光81810 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑19 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯20 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路1 天前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java