Java Stream.mapMulti中单参数方法引用符合BiConsumer类型疑问
方法引用匹配规则说明
你遇到的场景是Java中引用特定类型任意对象的实例方法这一类方法引用的标准适配逻辑,核心匹配规则如下:
- 对于实例方法来说,方法本身隐含一个
this作为第一个隐式入参,值为调用该方法的对象实例 - 当使用
类名::实例方法形式的方法引用时,Java会自动将函数式接口的第一个入参作为该实例方法的调用对象,函数式接口剩余的入参按顺序匹配实例方法的显式入参
对应到你的场景的匹配逻辑
首先明确你代码中的上下文约束:
exec.elts是Element类型的集合,exec.elts.stream()得到的是Stream<Element>,因此mapMulti要求的入参BiConsumer泛型为BiConsumer<? super Element, ? super Consumer<Integer>>- 该
BiConsumer的抽象方法签名为:void accept(Element element, Consumer<Integer> buffer) - 你传入的方法引用
Element::accept对应的实例方法签名为:void accept(Consumer<Integer> consumer)
Java会自动将BiConsumer的调用逻辑mapper.accept(element, buffer)转化为element.accept(buffer),参数类型、数量、返回值完全匹配,因此该方法引用是合法的。
同类场景的常见示例
我们日常开发中经常用到同类适配,比如:
// String的toUpperCase是无参实例方法 Function<String, String> toUpperCaseFunc = String::toUpperCase; // 实际调用逻辑等价于 str -> str.toUpperCase() String upper = toUpperCaseFunc.apply("test");
和你的场景逻辑完全一致:Function的第一个入参作为实例方法的调用对象,无剩余入参所以匹配无参实例方法。
四类Java方法引用的匹配规则梳理
为了方便你理解,整理四类方法引用的匹配逻辑:
- 静态方法引用(格式:
类名::静态方法):函数式接口的所有入参按顺序传入静态方法,匹配参数数量、类型、返回值即可 - 已有对象的实例方法引用(格式:
对象实例::实例方法):函数式接口的所有入参按顺序传入该对象的实例方法,匹配参数数量、类型、返回值即可 - 特定类型任意对象的实例方法引用(格式:
类名::实例方法):函数式接口的第一个入参作为方法调用的对象实例,剩余入参按顺序传入实例方法,匹配即可 - 构造方法引用(格式:
类名::new):函数式接口的所有入参按顺序传入构造方法,匹配参数数量、类型即可
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

