月关宝盒
::称为方法引用。它基本上是对单一方法的引用。即。它通过名称引用现有的方法。简短解释:下面是对静态方法的引用示例:class Hey {
public static double square(double num){
return Math.pow(num, 2);
}}Function square = Hey::square;double ans = square.apply(23d);square可以像对象引用一样传递,并在需要时触发。事实上,它可以很容易地用于引用对象的“正常”方法,就像static一张。例如:class Hey {
public double square(double num) {
return Math.pow(num, 2);
}}Hey hey = new Hey();Function square = hey::square;double ans = square.apply(23d);Function上面是功能接口..充分理解::,理解功能接口也很重要。很明显,功能接口是一个只有一个抽象方法的接口。功能接口的示例包括Runnable, Callable,和ActionListener.Function上面是一个功能接口,只有一个方法:apply..它使用一个参数并产生一个结果。为什么::S是很棒的是那,那个:方法引用是与lambda表达式(.)相同的处理方式的表达式,但它们不是提供方法主体,而是按名称引用现有的方法。例如:而不是写兰达的身体Function square = (Double x) -> x * x;你可以简单的做Function square = Hey::square;在运行时,这两个square方法的行为完全相同。字节码可能是相同的,也可能不是相同的(尽管,对于上述情况,生成相同的字节码;编译上面的字节码,然后用javap -c).要满足的唯一主要标准是:您提供的方法应该与用作对象引用的函数接口的方法具有类似的签名。.以下是非法行为:Supplier p = Hey::square; // illegalsquare期望一个参数并返回double..这个get方法供货商返回一个值,但不接受参数。因此,这将导致一个错误。方法引用是指函数接口的方法。(如前所述,每个函数接口只能有一个方法)。更多的例子:accept方法消费者接受输入,但不返回任何内容。Consumer b1 = System::exit; // void exit(int status)Consumer b2 = Arrays::sort;
// void sort(Object[] a)Consumer b3 = MyProgram::main; // void main(String... args)class Hey {
public double getRandom() {
return Math.random();
}}Callable call = hey::getRandom;Supplier call2 = hey::getRandom;DoubleSupplier sup = hey:
:getRandom;// Supplier is functional interface that takes no argument and gives a result上面,getRandom不使用参数并返回double..因此,满足以下标准的任何功能接口:不争论就回来double可以使用。另一个例子:Set set = new HashSet<>();set.addAll(Arrays.asList("leo","bale","hanks"));Predicate pred = set:
:contains;boolean exists = pred.test("leo");在参数化类型的情况下:class Param {
T elem;
public T get() {
return elem;
}
public void set(T elem) {
this.elem = elem;
}
public static E returnSame(E elem) {
return elem;
}}Supplier> obj = Param::new;Param param = obj.get();Consumer c = param:
:set;Supplier s = param::get;Function func = Param::returnSame;方法引用可以有不同的样式,但从根本上说,它们都意味着相同的东西,可以简单地可视化为lambdas:静态方法(ClassName::methName)特定对象的实例方法(instanceRef::methName)特定对象的超级方法(super::methName)特定类型的任意对象的实例方法(ClassName::methName)类构造函数引用(ClassName::new)数组构造函数引用(TypeName[]::new)有关进一步参考,请参见http:/cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html.