Вернуть функцию с произвольным количеством входных параметров - PullRequest
2 голосов
/ 01 мая 2020

Мой код должен предварительно проверить серию сложных регулярных выражений с помощью различных вспомогательных классов. Затем он должен выполнить серию вызовов функций после проверки, если все в порядке. Если конструкция case не улавливает что-то, мне нужно зарегистрировать это позже.

Я стараюсь избегать двух гудящих дублирующих операторов if.

Я думал, если большой if оператор (или switch) должен был вернуть функцию, я мог проверить, была ли эта возвращенная функция нулевой или нет, чтобы выполнить предварительную проверку. Если бы это было ноль, я мог бы также зарегистрировать это. Если бы оно не было нулевым, я мог бы позвонить напрямую. Таким образом, я могу избавиться от необходимости иметь сложную логику c, проверяющую две части кода.

Я думал что-то вроде:

class Playground {
    public static Function getFunction(String condition) {
        switch (condition) {
            case "one":
                return Function one(1);
            case "two":
                return Function two("two",2);
            default:
                return null;
        }
    }
    public static void one(int i) {
        System.out.println("one: i: " + i);
    }

    public static void two(String s, int i) {
        System.out.println("two: s: " + s + " i: " + i);
    }
    public static void main(String[ ] args) {
       Function f1 = getFunction("one");
       Function f2 = getFunction("two");
       f1();
       f2();
    }
}

Но Я не совсем понимаю правильный синтаксис.

Может кто-нибудь сказать мне, возможно ли это в Java? Если это так, возможно, кто-то может посоветовать исправления синтаксиса.

  • У всех вызываемых методов будет void return.
  • Они будут вызовами экземпляров, а не stati c методами.
  • Возвращаемая функция может иметь различное количество входных параметров. Когда метод вызывается, мне нужно как-то настроить это в том, что также возвращается.

Если такого способа нет, есть ли альтернатива, возможно, шаблон проектирования, который может помочь? (Кроме отображения сложного оператора if во что-то вроде целого числа. Если ничего не найдено, то это 0, иначе у вас есть значения. Тогда у вас будет другой переключатель, основанный на int.)

1 Ответ

3 голосов
/ 01 мая 2020

Похоже, вы хотите вернуть Runnable, который вызывает метод:

class Playground{
    public static Runnable getRunnable(String condition) {
        switch (condition) {
            case "one":
                return () -> one(1);
            case "two":
                return () -> two("two", 2);
            default:
                return null;
        }
    }
    public static void one(int i) {
        System.out.println("one: i: " + i);
    }

    public static void two(String s, int i) {
        System.out.println("two: s: " + s + " i: " + i);
    }
    public static void main(String[ ] args) {
       Runnable f1 = getRunnable("one");
       Runnable f2 = getRunnable("two");
       Runnable f3 = getRunnable("three");
       f1.run();
       f2.run();
       if (f3 == null) {
           System.out.println("none");
       }
    }
}
...