如何在 Java 中实现一个谓词,用于根据任意数量的规则交叉检查字符串?

How to implement a Predicate in Java used for cross-checking a String against an arbitrary amount of rules?

此问题是以下问题的延续:

我正在尝试使用谓词来交叉检查 string/word 与 rules/methods 的集合,return 是一个布尔值。 但是我在我的代码中实现它时遇到了困难。

public class CapValidator {

    /** PRIMARY METHODS **/
    private boolean capitalize(String word) {
       // boolean valid = true;
       // for (Predicate<> rule : rules) {
       //     valid = valid && rule.test(word);
       // }
        return false;
    }

    /** SUPPORT METHODS **/
    private boolean isNoun(String word) {
        // do some logic
    }

    private boolean isVerb(String word) {
        // do some logic
    }

    private boolean isParticiple(String word) {
        // do some logic
    }

}

关于如何实施 capitalize(String) 有什么建议吗?它应该检查单词是否符合一组规则(单词是名词或动词或分词或...)。

你可以只拥有以下内容:

private boolean capitalize(String word) {
    Stream<Predicate<String>> stream = Stream.of(this::isNoun, this::isVerb, this::isParticiple); 
    return stream.anyMatch(rule -> rule.test(word));
}

这将创建一个包含 3 个规则的流来检查并通过 ||ing 每个结果将它们减少为单个值。好处是如果需要添加更多规则,只需要更新Stream声明即可。

然而,另一种(更简单的)解决方案也可能是不使用 Streams 并为每个方法编写一系列 ||

另一种方法是形成复合谓词,然后应用它:

Predicate<String> capitalize = Stream.<Predicate<String>>of(this::isNoun, 
                  this::isVerb, 
                  this::isParticiple)
        .reduce(Predicate::or).orElse(s -> false);

/** PRIMARY METHODS **/
private boolean capitalize(String word) {
    return capitalize.test(word);
}

这里使用Predicate.or()方法减少了谓词流。你只能这样做一次。之后,您只需应用复合谓词。