java8新特性_::双冒号

java8新特性_::双冒号

来源:

方法引用通过方法的名字来指向一个方法。

方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

方法引用使用一对冒号 :: 。

构造器引用

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);




原文地址:https://www.cnblogs.com/ziyue7575/p/a27313e734cb645171572b28efcbb900.html