java8中:: 用法示例(JDK8双冒号用法)

当我们在Java8中使用Lambda表达式(Functional Interface)时,我们通常使用双冒号(::)操作符来引用方法。这种方式也称为方法引用(Method Reference),它提高了程序的可读性和简化了代码。

当我们在Java8中使用Lambda表达式(Functional Interface)时,我们通常使用双冒号(::)操作符来引用方法。这种方式也称为方法引用(Method Reference),它提高了程序的可读性和简化了代码。

与Lambda表达式类似,方法引用也需要和特定的Functional Interface搭配使用。在Java 8中,Java中提供了4种不同的方法引用类型,分别是:

  1. 引用静态方法,如:ClassB::staticMethod

  2. 引用含有特定对象实例方法的实例方法,如:obj::instanceMethod

  3. 引用含有特定类型对象的实例方法,如:ClassB::instanceMethod

  4. 引用构造函数,如:ClassB::new

下面分别介绍这四种不同的方法引用类型以及它们的使用方法。

引用静态方法

ClassB::staticMethod 表示引用 ClassB 类中的静态方法 staticMethod。在 Lambda 表达式中,可能会使用到 staticMethod 方法,并且这个方法静态的,我们可以直接使用上述的语言形式代替 Lambda 表达式。

以下是一个示例代码:

public class MethodRefExample {
    public static void printHello() {
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        Runnable helloTask = MethodRefExample::printHello;
        helloTask.run();
    }
}

以上代码定义了一个 Runnable 类型的 helloTask 对象,将 MethodRefExample 的 printHello 方法作为实现方法赋值给这个对象,并在 main 方法中调用 helloTask.run() 方法输出 Hello 字符串。

引用含有特定对象实例方法的实例方法

obj::instanceMethod 表示引用 obj 对象中的实例方法 instanceMethod,当 Lambda 表达式需要访问一个对象实例的方法并且这个对象实例方法已经存在时,我们可以使用这种方式来代替 Lambda 表达式。

以下是一个示例代码:

public class MethodRefExample {
    public void printHello() {
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        MethodRefExample instance = new MethodRefExample();
        Runnable helloTask = instance::printHello;
        helloTask.run();
    }
}

以上代码定义了一个 MethodRefExample 类型的 instance 对象,将实例方法 printHello 作为实现方法赋值给 Runnable 类型的 helloTask 对象,并在 main 方法中调用 helloTask.run() 输出 Hello 字符串。

引用含有特定类型对象的实例方法

ClassB::instanceMethod 表示引用 ClassB 类的对象中的实例方法 instanceMethod,它与第二种方式很类似,只是它将对象实例换成了对象类型。

以下是一个示例代码:

public class MethodRefExample {
    public void printHello() {
        System.out.println("Hello");
    }

    public static void main(String[] args) {
        Consumer<MethodRefExample> helloTask = MethodRefExample::printHello;
        helloTask.accept(new MethodRefExample());
    }
}

以上代码定义了一个 Consumer 类型的 helloTask 对象,将 MethodRefExample 类型的实例方法 printHello 作为实现方法赋值给这个对象,并在 main 方法中执行 helloTask.accept(new MethodRefExample()),输出 Hello 字符串。

引用构造函数

ClassB::new 表示引用 ClassB 类的构造函数,当 Lambda 表达式需要创建一个类的实例时,我们也可以使用方法引用来代替 Lambda 表达式。

以下是一个示例代码:

public class MethodRefExample {
    public static void main(String[] args) {
        Supplier<MethodRefExample> instanceSupplier = MethodRefExample::new;
        MethodRefExample instance = instanceSupplier.get();
    }
}

以上代码定义了一个 Supplier 类型的 instanceSupplier 对象,将 MethodRefExample 类的构造函数作为实现方法赋值给 instanceSupplier,并在 main 方法中执行 instanceSupplier.get() 创建一个 MethodRefExample 类的实例。

以上就是 Java 8 中方法引用的 4 种使用方法的详细说明。需要留意的是,Java8 中双冒号的使用在复杂应用中很有用,但在少量简单的情境下还是可以考虑采用羽毛球形式的 Lambda 表达式。

本文标题为:java8中:: 用法示例(JDK8双冒号用法)