试试这个就可以得到答案:
Object object = ...;
Supplier<String> s1 = object::toString;
Supplier<String> s2 = object::toString;
System.out.println(s1.equals(s2));
答案是...很遗憾,没有。
当然,如果您保留相同的引用(即相同的对象),它将起作用;但是,如上例所示,如果您请求两个 lambda,尽管它们看起来相同,但它们永远不会相等。因此,然后以后显然会起作用,但是如果按字面意思这样写,那么从集合中将永远不会起作用。reference = object::method
remove(reference)
remove(sameObject::sameMethod)
对于构造函数(例如ArrayList::new)和未绑定方法(例如Object::toString)的答案是否定的。似乎每次使用 lambda 表达式时都会构造一个新的 lambda。
正如@Hitobat所指出的那样,如果你考虑一下lambdas到底是什么以及它们来自哪里,这种不相等是有道理的。基本上,是 的句法 suggar。如果没有适当的 Object.equals 重载,匿名类的两个实例显然是不同的。正如许多人可能一样,我虽然在某个地方有一种常用的lambda的缓存,以使其更有效率;嗯,一点也不。Supplier<String> x = myObject::toString
Supplier<String> x = new Supplier<String>( ... )