如何在Java中实现用于根据任意数量的规则交叉检查字符串的谓词?
这个问题是以下问题的继续: 我试图使用谓词来对照一组返回布尔值的规则/方法交叉检查字符串/单词。 然而,我在代码中实现它时遇到了困难如何在Java中实现用于根据任意数量的规则交叉检查字符串的谓词?,java,parsing,java-8,filtering,predicate,Java,Parsing,Java 8,Filtering,Predicate,这个问题是以下问题的继续: 我试图使用谓词来对照一组返回布尔值的规则/方法交叉检查字符串/单词。 然而,我在代码中实现它时遇到了困难 public class CapValidator { /** PRIMARY METHODS **/ private boolean capitalize(String word) { // boolean valid = true; // for (Predicate<> rule : rules) {
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
}
}
公共类CapValidator{
/**主要方法**/
专用布尔大写(字符串字){
//布尔有效=真;
//for(谓词规则:规则){
//valid=有效&&rule.test(word);
// }
返回false;
}
/**支持方法**/
专用布尔值IsNon(字符串字){
//做些逻辑分析
}
私有布尔值是动词(字符串字){
//做些逻辑分析
}
专用布尔值IsPartiple(字符串字){
//做些逻辑分析
}
}
关于如何实现
大写(字符串)
,有什么建议吗?它应该检查这个词是否符合一套规则(这个词是名词、动词、分词或…。你可以有以下内容:
private boolean capitalize(String word) {
Stream<Predicate<String>> stream = Stream.of(this::isNoun, this::isVerb, this::isParticiple);
return stream.anyMatch(rule -> rule.test(word));
}
专用布尔大写(字符串字){
Stream-Stream=Stream.of(this::isNoun,this::isVerb,this::isParticiple);
返回stream.anyMatch(rule->rule.test(word));
}
这将创建一个由3条规则组成的检查流,并通过|
对每个结果进行排序,将它们减少为单个值。优点是,如果需要添加更多规则,只需更新流声明
但是,另一个(更简单的)解决方案可能是不使用流,只为每个方法编写一系列的
|
。另一种方法是形成一个复合谓词,然后应用它:
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 capitalize=Stream.of(this::isNoun,
这是动词,
本节(第1节)
.reduce(谓词::or).orElse(s->false);
/**主要方法**/
专用布尔大写(字符串字){
返回大写测试(word);
}
这里使用Predicate.or()
方法减少谓词流。你只能这样做一次。之后,您只需应用复合谓词