Java 8 函数式接口对象的 Java Hashcode 和 Equals

two*_*eap 6 java generics java-8 functional-interface

我有一些如下所示的代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我想确认一些FunctionSupplierBiFunction或不管它可能是MyObj如果将等于另一个调用的结果Function/Supplier等返回给定相同的输入相同的值。

因此,在这种情况下,Java 将使用equalslike so functionList1.get(0).apply(standardInstanceOfMyObj)equalsfunctionList2.get(0).apply(standardInstanceOfMyObj)等比较两个列表的值。

我的问题是,我如何覆盖equalshashcode针对特定类型Function<MyObj, String>使上述工作?

Pio*_*kin 6

你不能。但是,您可以为您的任何实际实现Function. 比较函数(在数学上)是一件棘手的事情,因为域空间可能是无限的,所以 Java 无法知道两个函数是相同的(除了在数字标识的情况下,equals()反正哪里都是真的)。如果您有一些特定的函数可以为其提供更细粒度的equals()/ hashCode()(例如,因为它们基于某种解析的表达式语言并且您可以比较字符串表示),那么您必须在您的自己的课。