java - Java 方法引用稳定吗?

标签 java java-8

如果我使用新语法获得方法引用:

anObject::aMethod

我总是得到同一个对象吗?也就是说,我可以相信对同一方法的两个引用是相等的吗?

很高兴知道,例如,我是否计划将它们用作我可以添加和删除的 Runnable 回调:

someLibrary.addCallback(anObject::aMethod)
// later
someLibrary.removeCallback(sameObject::sameMethod)

这是否需要将引用保存在 Runnable 变量中以保持稳定?

最佳答案

JLS makes no promises关于你从方法引用表达式中得到的东西的身份或平等。

您可以运行一个快速测试:

Object obj = new Object();

IntSupplier foo = obj::hashCode;
IntSupplier bar = obj::hashCode;

System.out.println(foo == bar);  // false

System.out.println(foo.equals(bar));  // false      

但这当然取决于实现。

可以使您的 lambda Serializable 并使用序列化表示来键入您的回调映射。见 How to serialize a lambda? .虽然这会起作用,但并不完全符合规范要求。

关于java - Java 方法引用稳定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50748534/

相关文章:

java - 在 PubSubToBigQuery 模板中定义 TableSchema

java - Collections.sort() 不使用compareTo Override 进行排序

java - "AlreadyBuiltException: This object has already been built"构建时 "springSecurityFilterChain"

java - 通过 OkHttp 创建的 URLConnection 将 useCache 设置为 false

java - yyyy-mm-dd 的正则表达式日期验证

java - 在 Java 8 中迭代流的最快方法是什么?

java - 在 RXjava 中应用重试

java - 可完成的 future : Waiting for first one normally return?

java - 作者使用 thenCompose 而不是 thenComposeAsync 的原因是否正确

java - 如何将 lambda 类型强制为特定类型?