Skip to content

在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作。那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?答案肯定是没有必要。那我们又是如何使用已经存在的方案的呢? 本篇文章通过四种情况来解释方法引用符是如何使用的。

先来简单体验一下,方法引用符“::”的使用方法

java
public static void main(String[] args) {
    Consumer<String> consumer1 = s -> System.out.println(s);
    consumer1.accept("张三");

    Consumer<String> consumer2 = System.out::println;
    consumer2.accept("张三");
}

静态方法的方法引用

类名::方法名

新建 dog

java
public class Dog {

    private String name;

    public Dog(String name) {
        this.name = name;
    }
    public static void bark(Dog dog) {
        System.out.println(dog.name + "叫了");
    }
}

引用静态方法 “bark

java
public static void main(String[] args) {
    Consumer<Dog> consumer = Dog::bark;
    consumer.accept(new Dog("哮天犬"));
}

控制台输出:哮天犬叫了

非静态方法使用对象实例引用

改变 Dog 类中的 bark 方法

java
public class Dog {

    private String name;

    public Dog(String name) {
        this.name = name;
    }
    public void bark(Dog dog) {
        System.out.println(dog.name + "叫了");
    }
}

使用:

java
public static void main(String[] args) {
    Dog dog = new Dog("张三");
    Consumer<Dog> consumer = dog::bark;
    consumer.accept(dog);
}

控制台输出:张三叫了

无参构造方法的引用

java
public class Dog {

    private String name;
    
    // 无参构造
    public Dog() {}

    public void bark(Dog dog) {
        System.out.println(dog.name + "叫了");
    }
}

使用

java
public static void main(String[] args) {
    Supplier<Dog> supplier = Dog::new;
    Dog dog = supplier.get();
}

有参构造方法的引用

java
public class Dog {

    private String name;


    // 有参构造
    public Dog(String name) {
        this.name = name;
    }

    public void bark(Dog dog) {
        System.out.println(dog.name + "叫了");
    }
}

使用

java
public static void main(String[] args) {
    // 接收string,输出Dog,jdk会自动找到有参构造
    Function<String,Dog> function = Dog::new;
    Dog dog = function.apply("张三");
    dog.bark(dog);
}

控制台输出:张三叫了