我有一个包含多种方法的类:
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 :(得分: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
}
答案 1 :(得分:3)
完全正常的例子
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
。如果它返回一个布尔值,则它是Predicate
,如果它返回其他值,则为Function
。还有其他像Supplier
和其他人。
在一个理想的世界里,我们会写:
class Service {
void doService( void(String,String) method /*<-- fictional method type*/ ) {
method("Hello", "world");
}
}
但我们现在必须使用这些功能接口。