关于Collectors示例中Person::getName方法引用的技术疑问
关于Stream.map与Person::getName方法引用的疑问解答
首先,你最初定义的Person类完全正确,不需要额外添加静态的getName方法:
class Person { String name; String getName() { return name; } }
你的困惑来自对Java方法引用适配规则的不了解,这里解释清楚:
Person::getName属于实例方法的方法引用,当它被用作Function<? super Person, String>类型的参数时,Java编译器会自动完成适配:把Function的apply(Person p)方法的参数p,作为调用getName()的实例对象,等价于你写lambda表达式p -> p.getName()。- 换句话说,实例方法的方法引用本身就隐含了“需要一个实例对象来调用该方法”的逻辑,编译器会自动把Function的输入参数绑定为这个实例对象,根本不需要手动写静态方法来传递参数。
再结合map方法的定义来看:
<R> Stream<R> map(Function<? super T,? extends R> mapper)
这里的T是Stream的元素类型(Person),R是映射后的类型(String)。Person::getName作为实例方法引用,完美适配这个Function:输入Person对象,返回其name属性的String值,完全满足map方法的要求。
所以你完全不用添加那个静态的getName方法,原代码就能正常运行。
内容的提问来源于stack exchange,提问作者notaorb
相关产品推荐
相关产品推荐

