2016-04-24 3 views
1

Я пишу программу, и я хочу знать, могу ли я передать метод в качестве параметра другого метода. Например, что-то из следующего:Есть ли способ передать метод в качестве параметра методу?

public boolean update(Method m){ //input is a method 
    int i = m.execute(); 
    // logic relating to the value of i 
} 

Я хочу знать, могу ли я сделать это в java. Сейчас я читаю о функциональном программировании и отражении.

+1

Можете ли вы использовать Java 8? Он добавляет поддержку лямбда-выражений, что упрощает функциональное программирование. Если нет, то размышление - это способ сделать то, что вы просите. –

+0

Насколько я понял из вашего вопроса, что вы не пытались создать простую программу, чтобы попробовать? Даже если это не сработает, это создает лучший вопрос, когда вы пишете код, проверяете его и рассказываете о результате. См. Http://stackoverflow.com/help/mcve –

+0

Да. Lambdas очень полезны и предлагают некоторые функциональные возможности программирования в Java – Logan

ответ

2

Это не имеет никакого отношения к отражению, но вы можете передать «ссылки на методы», если вы используете java 8+. Предполагая, что из вашего примера, что вы собираетесь использовать методы, которые не требуют никаких параметров и просто возвращают Int, вы можете сделать это:

public class MyClass { 
    public int getIntMemberFunction(){ ... } 
    public static int getIntStaticFunction(){ ... } 
} 

с вашей функцией обновления модифицированной выглядеть следующим образом,

public boolean update(IntSupplier s){ //input is a method reference or lambda 
    int i = s.get(); 
    // logic relating to the value of i 
} 

Тогда вы могли бы назвать update передавая ссылку на любую статическую функцию любого класса, пока он не принимает никаких параметров и возвращает Int, например:

boolean result = update(MyClass::getIntStaticFunction); 

или у НУ можно назвать update передавая ссылку на какой-либо функции члена конкретного объекта до тех пор, как он не принимает никаких параметров и возвращает Int, например:

MyClass myClassInstance = ... 
boolean result = update(myClassInstance::getIntMemberFunction); 

Если вы хотите добавить методы, которые принимают 1 или 2 параметра , вы можете создать версии update, которые принимают ToIntFunction или ToIntBiFunction. Помимо 2 параметров вам нужно будет добавить свои собственные функциональные интерфейсы.

0

Один из способов сделать это - использовать интерфейсы. В Java вы можете передать в качестве аргумента функции объект, реализующий конкретный интерфейс, и таким образом вы можете вызвать этот метод для этого объекта. Более современные языки, такие как Python, Swift, Javascript, имеют лучшую поддержку для этой идиомы.

Смежные вопросы