java8新特性_::雙冒號
來源:
- http://www.runoob.com/java/java8-method-references.html
- https://www.cnblogs.com/tietazhan/p/7486937.html
方法引用通過方法的名字來指向一個方法。
方法引用可以使語言的構造更緊湊簡潔,減少冗余代碼。
方法引用使用一對冒號 :: 。
構造器引用
1.定義Supplier
@FunctionalInterface
public interface Supplier<T> {
T get();
}
2.通過Supplier引用
//Supplier是jdk1.8的接口,這里和lamda一起使用了
public static Car create(final Supplier<Car> supplier) {
return supplier.get();
}
3.引用
final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );
靜態方法引用
方法是static的,name參數必須是循環對應的對象的
定義方法:
/*方法必須是static的
參數必須是循環的對象格式的
參數不必須是是final,可以是final
*/
public static void collide(Car car) {//
System.out.println("Collided " + car.toString());
}
調用
cars是一個list/數組等
cars.forEach( Car::collide );
特定類的任意對象的方法引用
定義方法
/*方法不是static時,不能有參數
*/
public void repair() {
System.out.println("Repaired " + this.toString());
}
調用:
cars.forEach( Car::repair );
特定對象的方法引用
對list中的某一個對象引用
/*
必須有參數,參數是遍歷的具體對象
*/
public void follow(Car another) {
System.out.println("Following the " + another.toString());
}
使用:
//對應的這個類必須是final的,否則所有的對象都可會調用這個方法
final Car police = Car.create( Car::new );
cars.forEach( police::follow );
lambda和雙:
public static void printValur(String str){
System.out.println("print value : "+str);
}
List<String> al = Arrays.asList("a","b","c","d");
- 1.8以前的遍歷:
for (String a: al) {
AcceptMethod.printValur(a);
}
- lambda
al.forEach(x->{ AcceptMethod.printValur(x); });
- 雙:
al.forEach(AcceptMethod::printValur);