Java Java 8 个功能接口对象的哈希码和等于
Java Hashcode and Equals for Java 8 functional interface objects
我有一些代码如下所示:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
class MyObj {
private final Double aDouble;
public MyObj(Double aDouble) {
this.aDouble = aDouble;
}
}
class Main {
public static void main(String[] args) {
List<Function<MyObj, String>> functionList1 = new ArrayList<>();
List<Function<MyObj, String>> functionList2 = new ArrayList<>();
// ... Add same Function<MyObj, String>s to both lists
// I want to assert that functionList1.equals functionList2
}
}
我想检查一些 Function
、Supplier
、BiFunction
或 MyObj
的任何内容是否与另一个相等,如果结果在给定相同输入的情况下调用 Function
/Supplier
等 returns 相同的值。
所以在这种情况下,Java 将使用 equals
比较两个列表的值,例如 functionList1.get(0).apply(standardInstanceOfMyObj)
等于 functionList2.get(0).apply(standardInstanceOfMyObj)
等
我的问题是,如何为 Function<MyObj, String>
等特定类型重写 equals
和 hashcode
以完成上述工作?
你不能。但是,您可以为任何确实实现 Function
的 class 覆盖它们。比较函数(在数学上)是一件棘手的事情,因为域 space 可能是无限的,所以 Java 无法知道两个函数是相同的(除了在数字恒等式的情况下,其中 equals()
无论如何都是真的)。如果您有一些特定的功能,您可以为其提供更细粒度的 equals()
/hashCode()
(例如,因为它们基于某些已解析的表达式语言并且您可以比较字符串表示形式),那么您必须在自己的 class.
中编写这些条件
我有一些代码如下所示:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
class MyObj {
private final Double aDouble;
public MyObj(Double aDouble) {
this.aDouble = aDouble;
}
}
class Main {
public static void main(String[] args) {
List<Function<MyObj, String>> functionList1 = new ArrayList<>();
List<Function<MyObj, String>> functionList2 = new ArrayList<>();
// ... Add same Function<MyObj, String>s to both lists
// I want to assert that functionList1.equals functionList2
}
}
我想检查一些 Function
、Supplier
、BiFunction
或 MyObj
的任何内容是否与另一个相等,如果结果在给定相同输入的情况下调用 Function
/Supplier
等 returns 相同的值。
所以在这种情况下,Java 将使用 equals
比较两个列表的值,例如 functionList1.get(0).apply(standardInstanceOfMyObj)
等于 functionList2.get(0).apply(standardInstanceOfMyObj)
等
我的问题是,如何为 Function<MyObj, String>
等特定类型重写 equals
和 hashcode
以完成上述工作?
你不能。但是,您可以为任何确实实现 Function
的 class 覆盖它们。比较函数(在数学上)是一件棘手的事情,因为域 space 可能是无限的,所以 Java 无法知道两个函数是相同的(除了在数字恒等式的情况下,其中 equals()
无论如何都是真的)。如果您有一些特定的功能,您可以为其提供更细粒度的 equals()
/hashCode()
(例如,因为它们基于某些已解析的表达式语言并且您可以比较字符串表示形式),那么您必须在自己的 class.