Java Hashcode和Equals for Java 8功能接口对象

时间:2017-10-24 14:12:04

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

我想检查一些FunctionSupplierBiFunctionMyObj可能是什么,如果调用的结果将等于另一个Function Supplier / equals等在给定相同输入的情况下返回相同的值。

因此,在这种情况下,Java会使用functionList1.get(0).apply(standardInstanceOfMyObj)比较两个列表的值,因此functionList2.get(0).apply(standardInstanceOfMyObj)等于equals等。

我的问题是,我如何覆盖hashcodeFunction<MyObj, String>等特定类型,例如<div class="container"> <nav class="navbar navbar-expand-md navbar-light bg-faded" id="menutop"> <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#nav-content" aria-controls="nav-content" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <!-- Brand --> <a class="navbar-brand" href="#"> BRAND </a> <!-- Links --> <div class="collapse navbar-collapse justify-content-end" id="nav-content"> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" href="#">COMO FUNCIONA</a> </li> <li class="nav-item"> <a class="nav-link" href="#">TRABAJA CON NOSOTROS</a> </li> <li class="nav-item"> <a class="nav-link" href="#">TIENDA</a> </li> <li class="nav-item"> <a class="nav-link" href="#">BLOG</a> </li> <li class="nav-item"> <a class="nav-link" href="#">EQUIPO</a> </li> <li class="nav-item"> <a class="nav-link" href="#">REPARA</a> </li> </ul> </div> </nav> </div> 才能完成上述工作?

1 个答案:

答案 0 :(得分:3)

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