2016-10-26 4 views
2

я класс, который содержит несколько методов:Java-8, как передать нефункциональный метод в качестве параметра

Class SimpleClass { 
    methodA(var1, var2) { 
     //body 
    } 

    methodB(var1, var2) { 
     //body 
    } 
    .... 

}

Использование Java 8 Lambda, можно отправить один из вышеуказанных методов, как параметр в другую функцию другого класса? Что-то, как показано ниже:

Class Service { 
    doService(Method arg) { 
    //Invoke passed simple class method here 
    arg() 
    } 

} 
+0

Есть экземпляр 'SimpleClass'? Или методы статичны? – shmosel

+1

Связанный вопрос был задан обратно до Java 8, но с тех пор [получил новые ответы] (http://stackoverflow.com/a/25005082/1743880) с помощью «Java 8 way», чтобы сделать это и эффективно канонический вопрос по этому вопросу. – Tunaki

ответ

2

Полностью рабочий пример

import java.util.function.BiConsumer; 
class SimpleClass { 
    void methodA(String a, String b) { 
     System.out.printf("%s %s", a, b); 
    } 
} 
class Service { 
    void doService(BiConsumer<String,String> method) { 
     method.accept("Hola", "mundo"); 
    } 
} 
class Main { 
    public static void main(String ... args) { 
     SimpleClass sc = new SimpleClass(); 
     Service s = new Service(); 
     s.doService(sc::methodA); 
    } 
} 

Потому что нет типов функций в Java 8, вы должны указать свою подпись службы, чтобы принять один из functional interfaces.

В общих чертах, если метод принимает аргументы, но не возвращает результат: это Consumer. Если он возвращает Boolean, то это Predicate, и если он возвращает какое-то другое значение, это Function. Есть и другие, такие как Supplier и другие.

В идеальном мире мы бы написали:

class Service { 
    void doService(void(String,String) method /*<-- fictional method type*/) { 
     method("Hello", "world"); 
    } 
} 

Но мы должны использовать эти функциональные интерфейсы в данный момент.

This is a very good read about method references in Java 8

+0

Что такое подпись doService? – bhspencer

+1

@bhspencer обновил пример – OscarRyz

+0

@OscarRyz: Thx для ответа. Могу ли я также передать коллекцию SimpleClass для обслуживания и в сервисе итерации через коллекцию простых объектов класса и вызвать один из методов simpleclass. Прямо сейчас я не могу этого сделать, потому что методы в простом классе - это методы экземпляра. –

4

Если doService имеет соответствующую подпись, вы можете написать:

service.doService(mySimpleClass::methodA); 

Полный пример:

class SimpleClass { 
    public void methodA(String a, String b) { 
    System.out.println(a + b); 
    } 
    //other methods 
} 

class Service { 
    public void doService(BiConsumer<String, String> consumer) { 
    consumer.accept("Hel", "lo"); 
    } 
} 

public static void main(String[] args) { 
    SimpleClass sc = new SimpleClass(); 
    new Service().doService(sc::methodA); //prints Hello 
}