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
方法。
方法引用的分类
方法引用有以下几种分类:
- 静态方法引用:
ClassName::staticMethod
- 实例方法引用:
instance::instanceMethod
- 对象方法引用:
ClassName::instanceMethod
- 构造方法引用:
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
[*] --> 静态方法引用
静态方法引用 --> 实例方法引用
实例方法引用 --> 对象方法引用
对象方法引用 --> 构造方法引