gpt4 book ai didi

java - 检查参数化谓词之间的相等性

转载 作者:行者123 更新时间:2023-11-30 05:53:38 25 4
gpt4 key购买 nike

我目前正在实现一种将谓词与文本字符串匹配的方法

为了进行匹配,我填充了 < Predicate, String> 的映射,然后我可以通过谓词检索相应的字符串。

问题是,当使用参数化谓词时,如下面的代码所示,相同的谓词匹配不同的参数(散列函数中未使用 valueToTest)

public static Predicate<MyObject> predicateCondition(String valueToTest) {
return myObject -> myObject.value.equals(valueToTest);
}

所以目前我需要为每个我想要测试的参数创建一个谓词,即:

public static Predicate<MyObject> predicateConditionValue1() {
return myObject -> myObject.value.equals("value1");
}

public static Predicate<MyObject> predicateConditionValue2() {
return myObject -> myObject.value.equals("value2");
}

是否有其他方法可以避免重复谓词?

最佳答案

tl;博士:

首先你应该知道 Predicate 不是类,而是 interface 。lambda 几乎是 anonymous classes (几乎没有差异,这在您的问题范围内并不重要)。因此,您在问题中显示的所有三个函数都会返回作为三个不同类的实例的对象(当然,它们都实现相同的接口(interface),这就是为什么您可以将它们全部用作 Map 中的键)。但是映射(实际上也是接口(interface),因此您需要了解您在代码中使用的确切映射实现是如何工作的)通常使用键类的 equals()、hashCode(),有时可能还使用compareTo()。因为您使用的是匿名类(严格来说:“几乎匿名类”),所以它使用 Object 类中的 equals() 和 hashCode() 。其中 hashCode() 不依赖于对象方法和数据,而是由 JRE 创建,equals() 比较该哈希码。

简要说明:

不要使用匿名(声明为 lambda)谓词作为映射中的键。创建您自己的类,该类实现 Predicate 接口(interface)并拥有您自己的 hashCode()、equals() 和 test() 实现。如果您仍然想使用 lambda,请使用这些匿名谓词作为您自己的键类的字段。

一般:

为了避免此类问题,只需将 java 中的 Lambda 视为语法糖即可(lambda 不仅仅是语法糖,而且几乎是语法糖)。当你编写代码时:

Predicate<String> aPredicate= s->"asd".equals(s);

将其视为以下代码的特殊形式:

Predicate<String> aPredicate= new Predicate<String>() {
@Override
public boolean test(String s) {
return "asd".equals(s);
}
};

关于java - 检查参数化谓词之间的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53516607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com