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

这个问题是一个延续: 如何检查输入是否符合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)任何建议? 它应检查该词是否符合一组规则(该词是名词或动词或分词或……)。

你可以拥有以下内容:

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

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

但是,另一个(更简单的)解决方案也可能是不使用Streams并且只编写一系列|| 对于每种方法。

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

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