这个问题是: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)
的任何建议?它应检查该词是否符合一组规则(该词是名词或动词或分词或......)。
答案 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()
方法减少谓词流。你只能这样做一次。之后,您只需应用复合谓词。