如何实现Java中的Predicate,用于针对任意数量的规则交叉检查String?

时间:2015-11-29 18:25:56

标签: java parsing java-8 filtering predicate

这个问题是:How to check whether an input conforms to an arbitrary amount of rules in Java?

的延续

我正在尝试使用Predicates来交叉检查一组返回布尔值的规则/方法的字符串/单词。 但是我在代码中实现它时遇到了困难。

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)的任何建议?它应检查该词是否符合一组规则(该词是名词或动词或分词或......)。

2 个答案:

答案 0 :(得分:3)

您可以拥有以下内容:

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个规则的Stream来检查并将它们缩减为单个值。优点是,如果您需要添加更多规则,则只需更新Stream声明。

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

答案 1 :(得分:0)

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

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()方法减少谓词流。你只能这样做一次。之后,您只需应用复合谓词。