Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中实现用于根据任意数量的规则交叉检查字符串的谓词?_Java_Parsing_Java 8_Filtering_Predicate - Fatal编程技术网

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