【问题标题】:Java Hashcode and Equals for Java 8 functional interface objectsJava 8 功能接口对象的 Java Hashcode 和 Equals
【发布时间】:2017-10-24 14:12:04
【问题描述】:

我有一些代码如下所示:

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
    }
}

我想检查一些FunctionSupplierBiFunction 或任何可能属于MyObj 的东西,如果调用Function/Supplier 的结果会等于另一个等给定相同的输入返回相同的值。

所以在这种情况下,Java 将使用 equals 比较两个列表的值,就像 functionList1.get(0).apply(standardInstanceOfMyObj) 等于 functionList2.get(0).apply(standardInstanceOfMyObj) 等等。

我的问题是,如何为 Function&lt;MyObj, String&gt; 等特定类型覆盖 equalshashcode 以使上述工作正常进行?

【问题讨论】:

  • 为什么要覆盖函数的方法,而不是你的数据类型?
  • 嗯,两个函数可能为参数a 返回相同的值,但为参数b 返回不同的值。你打算怎么处理?
  • 为什么要进行这些检查?如果它用于任何类型的测试(您使用“断言”表明这一点),您可能应该保留测试框架提供的方法。 equals() 和 hashcode() 是为了状态平等,而不是为了功能平等。
  • 它不是用于测试,而是更多地作为传递 Function 对象的一种方式,以便可以在适当的时间链接和应用它。但我同意你的观点,可能有比比较函数更好的方法来设计它。
  • Function 接口没有什么特别之处。您可以创建一个实现此接口并声明equalshashCode 方法的类。您无法控制 lambda 表达式或方法引用的相等性,但是在您的问题中,这些术语都没有出现,因此不清楚它们是否与您的问题相关。照原样回答您的问题,答案是您可以像使用任何其他界面一样进行操作。

标签: java generics java-8 functional-interface


【解决方案1】:

你不能。但是,您可以为实际实现Function 的任何类覆盖它们。比较函数(在数学上)是一项棘手的工作,因为域空间可能是无限的,所以 Java 无法知道两个函数是否相同(除了数字标识的情况,equals() 无论如何都是真的)。如果你有一些特定的函数可以提供更细粒度的equals()/hashCode()(例如,因为它们基于一些解析的表达式语言并且你可以比较字符串表示),那么你将拥有在你自己的课堂上写下这些标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2011-07-09
    • 2011-02-13
    相关资源
    最近更新 更多