方法引用与构造器引用

在Java 8中,引入了方法引用和构造器引用的概念,这可以简化代码并提高可读性。方法引用指的是直接引用已经存在的方法,构造器引用指的是引用已经存在的构造器。下面分别介绍方法引用和构造器引用的用法和示例。

方法引用

方法引用用于引用一个已经存在的方法,并且可以将其作为函数式接口的实例来使用。方法引用的语法形式为:接口或类名::方法名。方法引用一般分为四种情况:

  1. 引用静态方法;
  2. 引用某个对象的实例方法;
  3. 引用某个类型的任意对象的实例方法;
  4. 引用构造方法。

下面以示例代码来分别说明这四种情况:

import java.util.Arrays;
import java.util.List;

public class MethodReferenceDemo {
    public static void main(String[] args) {
        // 1. 引用静态方法
        List numbers = Arrays.asList(1, 2, 3, 4, 5);
        numbers.forEach(MethodReferenceDemo::print);

        // 2. 引用某个对象的实例方法
        MethodReferenceDemo demo = new MethodReferenceDemo();
        numbers.forEach(demo::printInstance);

        // 3. 引用某个类型的任意对象的实例方法
        numbers.forEach(Integer::toString);

        // 4. 引用构造方法
        List strings = Arrays.asList("Hello", "World");
        strings.stream().map(String::new).forEach(System.out::println);
    }

    public static void print(Integer number) {
        System.out.println(number);
    }

    public void printInstance(Integer number) {
        System.out.println(number);
    }
}

在上述代码中,首先定义了一个方法引用的类MethodReferenceDemo,并且实现了一个静态方法和一个实例方法print和printInstance。然后在main方法中使用方法引用对数字集合进行遍历和操作:

  1. 引用静态方法:使用类名::方法名的形式,直接引用静态方法print,可以输出数字集合中的每个元素;
  2. 引用某个对象的实例方法:使用对象::方法名的形式,直接引用实例方法printInstance,可以输出数字集合中的每个元素;
  3. 引用某个类型的任意对象的实例方法:使用类型::方法名的形式,直接引用Integer类的实例方法toString,可以将每个数字转为字符串;
  4. 引用构造方法:使用类型::new的形式,直接引用String类的构造方法,可以将每个字符串进行实例化。

构造器引用

构造器引用用于引用一个已经存在的构造方法,可以将构造方法引用作为函数式接口的实例来使用。构造器引用的语法形式为:类名::new。构造器引用只有一种情况:

引用某个类型的构造方法。下面以示例代码来说明构造器引用的用法:

import java.util.function.Supplier;

public class ConstructorReferenceDemo {
    public static void main(String[] args) {
        // 引用String的构造方法
        Supplier<String> supplier = String::new;
        String str = supplier.get();
        System.out.println(str);
    }
}

在上述代码中,首先定义了一个构造器引用的类ConstructorReferenceDemo。然后在main方法中使用构造器引用对String的构造方法进行引用,并且使用其作为Supplier的实例。最后调用supplier的get方法可以获取到一个String类型的实例,并输出。