Java双冒号(“::”)是Java 8中引入的一种新的语法,用于简化代码和提高代码的可读性。它主要用于函数式编程中的方法引用,可以将一个方法作为参数传递给另一个方法或者直接调用一个方法。

方法引用

方法引用是一种特殊的Lambda表达式,它用于直接调用一个已经存在的方法。在方法引用中,双冒号用来表示方法的引用。比如:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 使用Lambda表达式
names.forEach(name -> System.out.println(name));

// 使用方法引用
names.forEach(System.out::println);

上述代码中,System.out::println就是一个方法引用,它引用了System.out对象的println方法。

方法引用的分类

方法引用有以下几种分类:

  1. 静态方法引用:ClassName::staticMethod
  2. 实例方法引用:instance::instanceMethod
  3. 对象方法引用:ClassName::instanceMethod
  4. 构造方法引用:ClassName::new

下面分别介绍这几种方法引用的使用。

静态方法引用

静态方法引用通过类名来引用一个静态方法。比如:

class MathUtils {
    public static int square(int num) {
        return num * num;
    }
}

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
       .map(MathUtils::square)
       .forEach(System.out::println);

上述代码中,MathUtils::square就是一个静态方法引用,它引用了MathUtils类的square方法。

实例方法引用

实例方法引用通过实例来引用一个实例方法。比如:

class StringUtils {
    public boolean isNullOrEmpty(String str) {
        return str == null || str.isEmpty();
    }
}

List<String> strings = Arrays.asList("Hello", "", "World");
strings.stream()
       .filter(StringUtils::isNullOrEmpty)
       .forEach(System.out::println);

上述代码中,StringUtils::isNullOrEmpty就是一个实例方法引用,它引用了StringUtils类的isNullOrEmpty方法。

对象方法引用

对象方法引用通过对象名来引用一个实例方法。比如:

class Printer {
    public void print(String message) {
        System.out.println(message);
    }
}

List<String> messages = Arrays.asList("Hello", "World");
Printer printer = new Printer();
messages.forEach(printer::print);

上述代码中,printer::print就是一个对象方法引用,它引用了printer对象的print方法。

构造方法引用

构造方法引用通过类名和new关键字来引用一个构造方法。比如:

class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
       .map(Point::new)
       .forEach(System.out::println);

上述代码中,Point::new就是一个构造方法引用,它引用了Point类的构造方法。

总结

Java双冒号(“::”)是Java 8中引入的一种新的语法,用于简化代码和提高代码的可读性。它主要用于函数式编程中的方法引用,可以将一个方法作为参数传递给另一个方法或者直接调用一个方法。方法引用分为静态方法引用、实例方法引用、对象方法引用和构造方法引用。通过使用方法引用,我们可以使代码更加简洁和易于理解。

流程图

flowchart TD;
    A[开始] --> B[静态方法引用];
    B --> C[实例方法引用];
    C --> D[对象方法引用];
    D --> E[构造方法引用];
    E --> F[结束];

状态图

stateDiagram
    [*] --> 静态方法引用
    静态方法引用 --> 实例方法引用
    实例方法引用 --> 对象方法引用
    对象方法引用 --> 构造方法引