Java8新特性之方法引用实例说明

1、方法引用通过方法的名字来指向一个方法。
2、方法引用使用一对冒号 :: 。

下面这段代码,将展现对于不同方法的引用规则

package com.wj.java8.testPackage.methodUseTest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

/**
 * 方法引用
 */
class Fruit {
    private String name;
    //Supplier是jdk1.8的接口,这里和lamda一起使用了
    public static Fruit create(final Supplier<Fruit> supplier) {
        return supplier.get();
    }

    public static void collide(final Fruit car) {
        System.out.println("Collided " + car.toString());
    }

    public void follow(final Fruit another) {
        System.out.println("Following the " + another.toString());
    }

    public void repair() {
        System.out.println("Repaired " + this.toString());
    }

    public static void main(String[] args) {
        //构造器引用,语法是Class::new
        final Fruit fruit = Fruit.create( Fruit::new );
        final List< Fruit > cars = Arrays.asList( fruit );
        //静态方法引用:语法是Class::static_method
        cars.forEach(Fruit::collide);
        //特定类的任意对象的方法引用:语法是Class::method
        cars.forEach(Fruit::repair);
        //特定对象的方法引用:语法是instance::method
        final  Fruit fruit1 = Fruit.create(Fruit::new);
        cars.forEach(fruit1::follow);
        List fruits = new ArrayList();

        fruits.add("apple");
        fruits.add("pear");
        fruits.add("banana");
        fruits.add("peach");
        fruits.add("grape ");

        fruits.forEach(System.out::println);

    }
}

结果打印:

Collided com.wj.java8.testPackage.methodUseTest.Fruit@7106e68e
Repaired com.wj.java8.testPackage.methodUseTest.Fruit@7106e68e
Following the com.wj.java8.testPackage.methodUseTest.Fruit@7106e68e
apple
pear
banana
peach
grape

我们可以看到,方法引用可以使语言的构造更紧凑简洁,减少了很多的冗余代码,刚开始感觉有点难懂,不够表达本来的逻辑意思,是因为我们使用习惯了以前的语法规则,对于新事物毕竟要留一点时间去接受。

猜你喜欢

转载自blog.csdn.net/wangjie919/article/details/80463101
今日推荐