方法引用使得開發(fā)者可以直接引用現(xiàn)存的方法、Java類的構(gòu)造方法或者實(shí)例對(duì)象。方法引用和Lambda表達(dá)式配合使用,使得java類的構(gòu)造方法看起來(lái)緊湊而簡(jiǎn)潔,沒(méi)有很多復(fù)雜的模板代碼。
語(yǔ)法:
如果是靜態(tài)方法,則是ClassName::methodName。如 Object ::equals
如果是實(shí)例方法,則是Instance::methodName。如Object obj=new Object();obj::equals;
構(gòu)造函數(shù),則是ClassName::new
package com.ehking.example.java8.newfeature.demo05;
import java.util.function.Supplier;
/**
* Created by shiyanwu on 2017/4/13.
* Car類定義
*/
public class Car {
public static Car create(final Supplier<Car> supplier) {
return supplier.get();
}
public static void collide(final Car car) {
System.out.println("Collided " + car.toString());
}
public void follow(final Car another) {
System.out.println("Following the " + another.toString());
}
public void repair() {
System.out.println("Repaired " + this.toString());
}
}
引用的car測(cè)試?yán)樱?/p>
package com.ehking.example.java8.newfeature.demo05;
import java.util.Arrays;
import java.util.List;
/**
* Created by shiyanwu on 2017/4/13.
* java 測(cè)試 方法引用
*/
public class Java8MethodRef {
public static void main(String[] args) {
//第一種方法引用的類型是構(gòu)造器引用,語(yǔ)法是Class::new,或者更一般的形式:Class<T>::new。注意:這個(gè)構(gòu)造器沒(méi)有參數(shù)。
final Car car = Car.create(Car::new);
final List<Car> cars = Arrays.asList(car);
//第二種方法引用的類型是靜態(tài)方法引用,語(yǔ)法是Class::static_method。注意:這個(gè)方法接受一個(gè)Car類型的參數(shù)。
cars.forEach(Car::collide);
//第三種方法引用的類型是某個(gè)類的成員方法的引用,語(yǔ)法是Class::method,注意,這個(gè)方法沒(méi)有定義入?yún)ⅲ? cars.forEach(Car::repair);
//第四種方法引用的類型是某個(gè)實(shí)例對(duì)象的成員方法的引用,語(yǔ)法是instance::method。注意:這個(gè)方法接受一個(gè)Car類型的參數(shù):
final Car police = Car.create(Car::new);
cars.forEach(police::follow);
//Collided com.ehking.example.java8.newfeature.demo05.Car@4c98385c
//Repaired com.ehking.example.java8.newfeature.demo05.Car@4c98385c
//Following the com.ehking.example.java8.newfeature.demo05.Car@4c98385c
}
}