如何在 Java 中实现一个谓词,用于根据任意数量的规则交叉检查字符串?
How to implement a Predicate in Java used for cross-checking a String against an arbitrary amount of rules?
此问题是以下问题的延续:
我正在尝试使用谓词来交叉检查 string/word 与 rules/methods 的集合,return 是一个布尔值。
但是我在我的代码中实现它时遇到了困难。
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<Predicate<String>> stream = Stream.of(this::isNoun, this::isVerb, this::isParticiple);
return stream.anyMatch(rule -> rule.test(word));
}
这将创建一个包含 3 个规则的流来检查并通过 ||
ing 每个结果将它们减少为单个值。好处是如果需要添加更多规则,只需要更新Stream声明即可。
然而,另一种(更简单的)解决方案也可能是不使用 Streams 并为每个方法编写一系列 ||
。
另一种方法是形成复合谓词,然后应用它:
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()
方法减少了谓词流。你只能这样做一次。之后,您只需应用复合谓词。
此问题是以下问题的延续:
我正在尝试使用谓词来交叉检查 string/word 与 rules/methods 的集合,return 是一个布尔值。 但是我在我的代码中实现它时遇到了困难。
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<Predicate<String>> stream = Stream.of(this::isNoun, this::isVerb, this::isParticiple);
return stream.anyMatch(rule -> rule.test(word));
}
这将创建一个包含 3 个规则的流来检查并通过 ||
ing 每个结果将它们减少为单个值。好处是如果需要添加更多规则,只需要更新Stream声明即可。
然而,另一种(更简单的)解决方案也可能是不使用 Streams 并为每个方法编写一系列 ||
。
另一种方法是形成复合谓词,然后应用它:
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()
方法减少了谓词流。你只能这样做一次。之后,您只需应用复合谓词。