您的位置:

Java方法引用

一、方法引用概述

Java 8引入了Lambda表达式,Lambda表达式是一种轻量级的匿名函数,它使得我们可以将函数作为参数进行传递和处理。为了更加方便地操纵函数,Java 8还引入了方法引用。方法引用是指可以在不需要向Lambda表达式中传递参数的情况下,直接引用已有方法或构造方法。在方法引用中,方法的名称作为Lambda表达式的参数,或者说方法引用是一种简化Lambda表达式的语法。

二、方法引用的类型

Java 8中,方法引用可以分为如下4类。

1. 类的静态方法引用

public class MethodReference {
    public static void printMessage() {
        System.out.println("Hello, world!");
    }
 
    public static void main(String[] args) {
        Runnable runnable = MethodReference::printMessage;
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

在上述代码中,我们引用了一个静态方法printMessage()。在main()方法中,我们创建了一个Runnable接口实例,这个实例中的run()方法使用MethodReference :: printMessage的方法引用作为Lambda表达式,在调用run()方法时,会直接调用printMessage()方法输出字符串“Hello, world!”。

2. 对象实例的方法引用

public class MethodReference {
    public void printMessage() {
        System.out.println("Hello, world!");
    }
 
    public static void main(String[] args) {
        MethodReference ref = new MethodReference();
        Runnable runnable = ref::printMessage;
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

在这个例子中,我们创建了一个MethodReference类的实例,然后使用对象实例的方法引用创建了一个Runnable接口实例,这个实例中的run()方法在调用时,会直接调用ref实例的printMessage()方法。在这种情况下,Lambda表达式的第一个参数是方法的接收者,第二个参数是方法的参数。

3. 类的任意对象的方法引用

public class MethodReference {
    public void printMessage(String message) {
        System.out.println(message);
    }
 
    public static void main(String[] args) {
        Consumer<String> consumer = new MethodReference()::printMessage;
        consumer.accept("Hello, world!");
    }
}

在这个例子中,我们创建了一个Consumer 接口实例,这个实例中的accept()方法使用MethodReference的任意对象的方法引用作为Lambda表达式。在调用accept()方法时,会调用MethodReference对象的printMessage()方法,我们传入的参数会作为printMessage()方法的参数。

4. 构造方法引用

class Person {
    String name;
    int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public int getAge() {
        return age;
    }
}
 
interface PersonFactory<P extends Person> {
    P create(String name, int age);
}
 
public class MethodReference {
    public static void main(String[] args) {
        PersonFactory<Person> factory = Person::new;
        Person person = factory.create("Kobe", 41);
        System.out.println(person.getName() + " is " + person.getAge() + " years old.");
    }
}

在这个例子中,我们定义了一个Person类和一个PersonFactory接口。PersonFactory接口中有一个create()方法,这个方法可以用来创建Person对象。我们使用了构造方法引用,将Person::new作为Lambda表达式传递给PersonFactory的create()方法,实现了创建Person对象的功能。

三、总结

本文介绍了Java方法引用的概念和4种类型,在实际的开发中,方法引用可以简化代码并提高可读性。理解和掌握方法引用的语法和用法,对于Java 8的学习和开发都是非常有帮助的。