2 回答
TA贡献1860条经验 获得超8个赞
在我看来,在第一个示例中,lambda 在创建时捕获了 Person 对象的状态,并且在调用它时不会尝试重新评估它,而在第二种情况下,它似乎没有捕获它,但在调用时重新评估它。
首先,它是一个方法引用,而不是 lambda 表达式。
在这两种情况下,对Person
实例的引用都被方法引用捕获(这不是“Person 对象的状态”)。这意味着如果Person
实例的状态发生变化,则执行功能接口的方法的结果可能会发生变化。
方法引用不会创建Person
它捕获其引用的实例的副本。
TA贡献2051条经验 获得超10个赞
这在某种程度上与 lambdas 或方法引用无关,它只是您正在使用的这些构造的副作用。
为了更简单的推理,您可以将其视为:
static class SupplierHolder {
private final Person p;
// constructor/getter
}
static class Person {
private String name;
// constructor/getter/setter
}
当您创建:Supplier<String> f = p::getName;时,您可以将其视为创建一个SupplierHolder以 aPerson作为输入并具有对其getName.
这就像做:
Person p = new Person("Bob");
SupplierHolder sh = new SupplierHolder(p);
p = null; // this has no effect on the reference that SupplierHolder holds
System.out.println(sh.getPerson().getName());
在你的第二个例子中,你有:
Person p = new Person("Bob");
SupplierHolder sh = new SupplierHolder(p);
p.setName("Alice");
现在p引用和SupplierHolder持有的引用“作用于”同一个实例——它们指向同一个对象。
这在现实中并不完全相同,但我想证明了这一点。
添加回答
举报