Мне нужно иметь возможность выполнить вызов функции, передав в качестве параметра полный оператор вызова функции - java - PullRequest
0 голосов
/ 31 марта 2020

Допустим, у меня есть ниже

class abc{
    void doSomething(String abc){
        //does Something
    }
}
  • Мне нужно иметь возможность создать функцию, чтобы я мог передать полный вызов в качестве параметра.

    functionCall ( doSomething (ab c)) {}

  • пожалуйста, сообщите, если это возможно. похоже на то, что происходит в операторе if.

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Создайте функцию, которая принимает в качестве аргумента функциональный интерфейс Consumer

public static void functionCall(Consumer<String> consumer, String value) {
    consumer.accept(value);
}

Затем используйте его, как показано ниже, это решение для Java 8. Для более новых версий вы можете сделать это более чистым способом. Смотрите ответ от @ akuzminykh

Abc abc = new Abc();
functionalCall(s -> abc.doSomething(s), "Hi");
1 голос
/ 31 марта 2020

Вы можете передать функцию с одним параметром и без типа возврата как Consumer<T>.

static void functionCall(Consumer<String> function, String argument) {
    function.accept(argument); // Call the method with the argument.
}
...
    Abc object = new Abc();
    Consumer<String> function = object::doSomething; // Get function variable.
    functionCall(function, "foobar");

Поскольку ваш метод является методом экземпляра, вам необходимо получить ссылка на метод через экземпляр класса. Это то, что у меня есть object. Этот синтаксис работает на Java 11.0.6.

0 голосов
/ 31 марта 2020

Вы можете поместить метод doSomething в абстрактный класс (Ab c), а затем создать анонимный класс, вызвав нужный метод ie:

public class TemplateExample {

    public static void main(String args[]) {
        TemplateExample instance = new TemplateExample();
        PrintSomething pa = instance.new PrintSomething() {
            @Override
            void print() {
                System.out.println("PrintSomething pa");
            }
        };

        PrintSomething pb = instance.new PrintSomething() {
            @Override
            void print() {
                System.out.println("PrintSomething pb");
            }
        };

        pa.print();
        pb.print();

    }

    abstract class PrintSomething {
        abstract void print();
    }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...