java8新特性_::双冒号
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);