下面的代码是如何工作的?我在需要Function的地方传递了一个Supplier。
class Scratch {
private Bar bar = new Bar("foo");
public static void main(String[] args) {
Scratch scratch = new Scratch();
System.out.println(scratch.getBarValue(Bar::getValue));
}
public <T> T getBarValue(Function<Bar, T> extractor) {
return extractor.apply(bar);
}
static class Bar {
private String value;
Bar(String value) {
this.value = value;
}
String getValue() {
return value;
}
}
}我知道Java正在从供应商那里创建一个函数,但奇怪的是找不到任何与此相关的文档。
发布于 2021-01-19 21:38:59
Bar::getValue是一个接受Bar实例并返回字符串的函数。它不是一个供应商,因为没有Bar实例,它就不能被调用。
给定一个特定的实例,bar::getValue就是一个供应者,因为它只从该特定的Bar实例中获取值。但是,需要为Bar::getValue提供一个Bar实例,以便在其上调用getValue()。所以它是一个Function<Bar, String>。
发布于 2021-01-19 21:46:12
getValue()看起来没有参数,但它实际上有一个隐式的this参数。
通常,这被掩饰在object.method(...)的语法糖后面。但是,当您使用::创建方法引用时,隐式this变得显式。然后,getValue()被视为一个单参数函数,因为只有当它知道它在什么Bar上被调用时,才能调用它。
任何实例方法都会发生这种情况。它不适用于static方法;它们没有this。
https://stackoverflow.com/questions/65792567
复制相似问题