Мне нужно передать условие в качестве аргумента - PullRequest
2 голосов
/ 27 июня 2019

В основном мне нужно передать условие в качестве аргумента в метод и продолжать проверять это условие до тех пор, пока оно не изменит свое значение.

Ниже приведен пример метода, который нажимает определенную клавишу клавиатуры до тех пор, покаусловие выполнено.

Например, у меня есть случай, в котором я пытаюсь прочитать страницу «Условия предоставления услуг», и мне нужно нажимать «Вниз», пока полоса прокрутки не достигнет дна.

public static void pressKeyUntilCondition(Keys key, boolean condition) {
    while(condition) {
        press(key);
        timesPressed++;
    }
}

Редактировать: Кроме того, еще один способ решения моей проблемы - если бы я мог передать метод в свою функцию pressKeyUntilCondition (), чтобы я мог напрямую отправить свой логический метод getHeightFromBottom () в условие While.

Ответы [ 4 ]

3 голосов
/ 27 июня 2019

Вы можете использовать Предикат для этого.Предикат является булевозначной функцией.Таким образом, вы можете проверить свою ценность, пока условие не будет выполнено.

 public static void pressKeyUntilCondition(List<String> key, Predicate<YourObjectType> condition) {
    while(condition.test(yourValueToCheck)) {
        press(key);
        timesPressed++;
    }
}
1 голос
/ 27 июня 2019

Вы можете передать предикат своему методу:

public static void pressKeyUntilCondition(Keys key, Predicate<Integer> condition) {
   while(condition.test(timesPressed)) {
      press(key);
      timesPressed++;
    }
}

И условие, которое вы передаете, может быть, например:

Predicate<Integer> predicate = integer -> integer == 3;

И если вам нужно больше "условий дляЧтобы оценить, вы можете создать некоторый класс модели, который содержит эти два поля и создать предикат из него:

public class ConditionValues {
        private int timesPressed;
        private Keys key;
        //getters setters
}

Predicate<ConditionValues> predicate = values -> values.getMaxTimePressed() ==  3 && values.getKey() == Keys.DOWN;

public static void pressKeyUntilCondition(Keys key, Predicate<ConditionValues> condition) {
    ConditionValues conditionValues = new ConditionValues(Keys.DOWN, 0);
    while(condition.test(conditionValues)) {
        press(key);
        timesPressed++;
        conditionValues.setTimesPressed(timesPressed);
    }

Конечно, это просто POC, так что вы можете вносить любые корректировки по своему желанию, например, передавая желаемый ключ какпараметр.

0 голосов
/ 27 июня 2019

Я не понимаю, что именно спрашивают, но из того, что я понимаю, вы можете сделать следующее.

Если вы хотите проверить динамическое решение, вы можете просто проверить метод вместо статического условия boolean. Примерно так:

private static final int BOTTOM_SCROLLBAR_POSITION = 777; // todo: change to your required position

private int getScrollBarPosition() {
    return 666; // todo: implement your scrollbar position logic
}

public void pressKeyUntilCondition(Keys key) {
    while (getScrollBarPosition() <= BOTTOM_SCROLLBAR_POSITION) { // using just an existing function
        press(key);
        timesPressed++;
    }
}

Если вы хотите передать настраиваемое условие, вы можете использовать некоторый класс из java.util.function, например, Predicate или BooleanSupplier, например:

private void callPressKeyUntilCondition() {
    pressKeyUntilCondition(
        Keys.ARROW_DOWN, 
        () -> getScrollBarPosition() <= BOTTOM_SCROLLBAR_POSITION // BooleanSupplier lambda implementation
    );
}

public void pressKeyUntilCondition(Keys key, BooleanSupplier conditionSupplier) {
    while ( !conditionSupplier.getAsBoolean() ) { // using just an existing function
        press(key);
        timesPressed++;
    }
}
0 голосов
/ 27 июня 2019

Возможно, вы хотите, чтобы ваше состояние было изменяемым (не окончательным).Поэтому рассмотрим некоторый интерфейс с реальным значением (или проверкой, которое вам нужно сделать), который вы можете вызвать.

Примерно так:

public static void pressKeyUntilCondition(Keys key, Reference<Boolean> reference) {
    while(reference.get()) {
        press(key);
        timesPressed++;
    }
}

Еще один момент, на который следует обратить внимание:не используйте бесконечный процессор во время цикла, так что вы можете проверять значение только изредка или вы можете перевести ваш поток в спящий режим и разбудить его, только если условие выполнено.

(Это работает только в том случае, если действие нажатия клавиши не требуется применять постоянно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...