gpt4 book ai didi

java - Java 8 中的谓词

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:21 26 4
gpt4 key购买 nike

我有一个程序可以分析文本的某些属性。代码的基本结构对于所有属性都是相同的,它仅在一行中有所不同:webDataField.containsAttributeXYZ(); 如下所示:

for (int index = 0; index < fields.size(); index++) {
WebDataField webDataField = fields.get(index);
boolean expectedCondition = webDataField.containsAttributeXYZ(); // Varies at this line..

Double score = evaluateBooleanCondition(actualCondition, expectedCondition);

WebDataFields fieldName = webDataField.getFieldName();
...
}

我不想为每个条件编写相同的代码(并在代码中重复自己),我想编写一次代码的主体并将条件(计算结果为真或假)传递给方法。

我是 Java Predicate 的新手,但如果我理解正确的话,这正是 Java 中谓词的功能。

这是否迫使我在其自己的类中编写每个条件,然后让该类实现 Predicate 接口(interface)?

如果是这样,该函数(之前在包含类似函数的类中声明的)将需要转换为如下形式:

class ContainsAttributeXYZ implements Predicate<Boolean>

这会导致代码迷失方向并引发程序中类数量的大量增加(因为每个函数都需要转换为一个类)

还是我误解了谓词在 Java 中的工作原理?还有其他方法吗?

谢谢

最佳答案

这是一个以 Predicate 作为参数的示例方法:

void processFields(List<WebDataField> fields, Predicate<WebDataField> predicate) {
for (WebDataField webDataField : fields) {
boolean expectedCondition = predicate.test(webDataField);
}
}

您可以通过传递方法引用来调用它,如下所示:

processFields(fields, WebDataField::containsAttributeXYZ);
processFields(fields, WebDataField::containsAttributeABC);

其中 containsAttributeXYZcontainsAttributeABC 是返回 booleanWebDataField 类的方法。或者您可以在不修改 WebDataField 的情况下创建内联 lambda。例如。 :

processFields(fields, w -> w.getFieldName().length() > 5);

你不需要创建一个实现Predicate的类

关于java - Java 8 中的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43901451/

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