Java 8 功能接口(interface)对象的 Java Hashcode 和 Equals

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

我想检查一些 Function , Supplier , BiFunctionMyObj 的任何内容, 如果调用 Function 的结果等于另一个/Supplier etc 在给定相同输入的情况下返回相同的值。

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

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

最佳答案

你不能。但是,您可以为任何实际实现 Function 的类覆盖它们。比较函数(在数学上)是一件棘手的事情,因为域空间可能是无限的,所以 Java 无法知道两个函数是否相同(除了数字标识的情况,其中 equals() 无论如何都是真的)。如果您有一些特定的功能,您可以为其提供更细粒度的 equals()/hashCode()(例如,因为它们基于某些已解析的表达式语言并且您可以比较字符串表示形式),然后您必须在自己的类中编写这些条件。

关于Java 8 功能接口(interface)对象的 Java Hashcode 和 Equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46912790/

相关文章:

java - 返回类型具有泛型的方法对象?

Java - 将参数传递给 Main 方法

java - 为什么 flatMap() 之后的 filter() 在 Java 流中是 "not completely"懒惰的?

java - Android 14 及更高版本是否可以使用 Java 8 功能Optional 和 Stream

java - TypeElement 与 TypeMirror 作为 Java 注释处理器的数据模型

java - 这红色 !在 Eclipse 中构建后进行标记

c# - 由特定通用包含接口(interface)参数化的通用容器接口(interface)

generics - "borrowed value does not live long enough"具有返回 impl 特征的通用函数

java - 接口(interface)及其子类及其类型和子类型的通用迭代器

java - 以不同的方法将操作附加到 Stream 是一种不好的做法吗?