Как реализовать предикат в 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() метод. Вы можете сделать это только один раз. После этого вы просто применяете составной предикат.

Другие вопросы по тегам