【发布时间】: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
}
}
我想检查一些Function、Supplier、BiFunction 或任何可能属于MyObj 的东西,如果调用Function/Supplier 的结果会等于另一个等给定相同的输入返回相同的值。
所以在这种情况下,Java 将使用 equals 比较两个列表的值,就像 functionList1.get(0).apply(standardInstanceOfMyObj) 等于 functionList2.get(0).apply(standardInstanceOfMyObj) 等等。
我的问题是,如何为 Function<MyObj, String> 等特定类型覆盖 equals 和 hashcode 以使上述工作正常进行?
【问题讨论】:
-
为什么要覆盖函数的方法,而不是你的数据类型?
-
嗯,两个函数可能为参数
a返回相同的值,但为参数b返回不同的值。你打算怎么处理? -
为什么要进行这些检查?如果它用于任何类型的测试(您使用“断言”表明这一点),您可能应该保留测试框架提供的方法。 equals() 和 hashcode() 是为了状态平等,而不是为了功能平等。
-
它不是用于测试,而是更多地作为传递 Function 对象的一种方式,以便可以在适当的时间链接和应用它。但我同意你的观点,可能有比比较函数更好的方法来设计它。
-
Function接口没有什么特别之处。您可以创建一个实现此接口并声明equals和hashCode方法的类。您无法控制 lambda 表达式或方法引用的相等性,但是在您的问题中,这些术语都没有出现,因此不清楚它们是否与您的问题相关。照原样回答您的问题,答案是您可以像使用任何其他界面一样进行操作。
标签: java generics java-8 functional-interface