Как реализовать предикат в Java, используемый для перекрестной проверки строки на произвольное количество правил?
Этот вопрос является продолжением: Как проверить, соответствует ли ввод произвольному количеству правил в Java?
Я пытаюсь использовать предикаты для перекрестной проверки строки / слова с набором правил / методов, которые возвращают логическое значение. Однако я испытываю трудности с реализацией этого в моем коде.
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)
? Следует проверить, соответствует ли слово набору правил (слово является существительным или глаголом или причастием или...).
2 ответа
Вы могли бы просто иметь следующее:
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.
Однако, другое (более простое) решение может также состоять в том, чтобы не использовать потоки и просто написать серию ||
для каждого метода.
Альтернативный подход состоит в том, чтобы сформировать составной предикат, а затем применить его:
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()
метод. Вы можете сделать это только один раз. После этого вы просто применяете составной предикат.