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;
相关推荐
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 高校晚查寝系统为例,包含答辩的问题和答案
java
leaves falling3 小时前
Qt 项目:计算圆面积
开发语言·qt
xiaoye37083 小时前
某大厂java面试题二面20260313
java·开发语言·spring
Full Stack Developme3 小时前
Java -jar 命令 可以有哪些参数设置
java·开发语言·jar
独隅3 小时前
Python `with` 语句 (上下文管理器) 深度解析与避坑指南
开发语言·python
做怪小疯子3 小时前
Python 基础学习
开发语言·python·学习
一只程序熊3 小时前
vite-cool-unix-ctx] Unexpected token l in JSON at position 0
java·服务器·前端
晨晖24 小时前
idea2017的下载,破解及使用
java·ide·intellij-idea
denggun123454 小时前
结构化并发(Structured Concurrency)
开发语言·ios·swift
OKkankan4 小时前
红黑树的原理及实现
开发语言·数据结构·c++·算法