как передать параметры в метод runnable - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть функция functionAcceptsMethod, которая принимает выполняемый метод в качестве параметра, я хочу вызвать functionAcceptsMethod, передав метод с параметрами.

, когда я вызываю functionAcceptsMethod, передав без параметров его хорошо, но как передать функцию с параметрами.

вот пример

 private void testFun() {
        functionAcceptsMethod(this::funWithoutParams);
        functionAcceptsMethod(this::funWithParams); // this where I need to pass params
        //functionAcceptsMethod(() -> funWithParams("abcd")); // I tried this, is this the right 
         //way?
    }

private void funWithoutParams() {
    //do something
}

private void funWithParams(String testString) {
    //do something
}

private  void functionAcceptsMethod(Runnable method) {
    method.run();
}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Правильный способ состоит в том, чтобы иметь версию вашего метода functionAcceptsMethod с параметром:

private void <T> functionAcceptsMethod(Consumer<T> method, T argument) {
    method.accept(argument);
}

Обратите внимание, что Runnable#run - это функциональный интерфейс без параметра, поэтому вы не можете использовать его здесь. Вы должны использовать Consumer. Теперь вы можете сделать это:

functionAcceptsMethod(this::funWithParams, "abc");

Проверьте java.util.function для получения дополнительных возможностей.

0 голосов
/ 16 апреля 2020

Да, подход

functionAcceptsMethod(() -> funWithParams("abcd"));

в порядке, если ваша цель просто передать ссылку на метод и получить аргументы в параметрах метода functionAcceptsMethod, затем использовать Consumer<T> как Аргумент получателя функции

Как вы хотели в примере:

public static <T> void functionAcceptsMethod(Consumer<T> consumer, T t){
    consumer.accept(t);
}

Это универсальная c версия, которая будет принимать любой метод с одним входным параметром. и пример использования:

public void example(){
    // Automatic type inferring
    functionAcceptsMethod(this::func, "f");
    functionAcceptsMethod(this::func2, 0);
    // Explicit type specification
    functionAcceptsMethod<Float>(this::func3, 0f);
}
public void func(String s){
    System.out.println(s);
}
public void func2(int i){
    System.out.println(i);
}
public void func3(float f){
}
...