Java 8中的谓词

Lit*_*vin 6 java oop lambda predicate java-8

我有一个程序来分析某些属性的文本.代码的基本结构对于所有属性都是相同的,它只在一行中变化: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();
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

class ContainsAttributeXYZ implements Predicate<Boolean>
Run Code Online (Sandbox Code Playgroud)

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

或者我误解了Predicates如何在Java中工作?还有另一种方法吗?

谢谢

Man*_*dis 5

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

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

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

processFields(fields, WebDataField::containsAttributeXYZ);
processFields(fields, WebDataField::containsAttributeABC);
Run Code Online (Sandbox Code Playgroud)

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

processFields(fields, w -> w.getFieldName().length() > 5);
Run Code Online (Sandbox Code Playgroud)

您不需要创建实现的类 Predicate