Java 8如何将非函数方法作为参数

时间:2016-10-26 18:30:58

标签: java lambda 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()
   }

}

2 个答案:

答案 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");
   }
} 

但我们现在必须使用这些功能接口。

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