在Java中,ClassName::methodName 是一个方法引用(Method Reference)的表示形式。这是Java 8引入的一个新特性,主要用于简化Lambda表达式。它允许你更简洁、更易读的方式引用一个已存在的方法。
方法引用分为以下几种类型:
1.静态方法引用:ClassName::staticMethodName
2.某个对象的实例方法引用:instance::instanceMethodName
3.类的任意对象的实例方法引用:ClassName::instanceMethodName
4.构造函数引用:ClassName::new
工作原理
当你有一个函数式接口,并且你需要使用一个已经存在的方法来实现这个接口的时候,你可以使用方法引用。
例如,考虑以下函数式接口:
@FunctionalInterface
interface Converter {
int convert(String s);
}
假设你有一个静态方法:
public class StringConverter {
public static int stringToInt(String s) {
return Integer.parseInt(s);
}
}
使用Lambda表达式,你可以这样实现Converter接口:
Converter myConverter = (s) -> StringConverter.stringToInt(s);
使用方法引用,你可以更简洁地写:
Converter myConverter = StringConverter::stringToInt;
当你调用 myConverter.convert("123") 的时候,它实际上调用的是 StringConverter.stringToInt("123")。
这样做的好处是,代码更简洁,可读性也更强。
示例
静态方法引用public class Test {
public static void printSomething(String something) {
System.out.println(something);
}public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.forEach(Test::printSomething); // 使用静态方法引用
}
}
某个对象的实例方法引用
public class Printer {
public void printSomething(String something) {
System.out.println(something);
}public static void main(String[] args) {
Printer printer = new Printer();
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.forEach(printer::printSomething); // 使用实例方法引用
}
}
类的任意对象的实例方法引用
public class Test {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.forEach(String::toUpperCase); // 使用任意对象的实例方法引用
}
}
构造函数引用
@FunctionalInterface
interface Factory<T> {
T create();
}class MyClass {
MyClass() {
System.out.println("MyClass Constructor Called");
}public static void main(String[] args) {
Factory<MyClass> factory = MyClass::new; // 使用构造函数引用
MyClass myClass = factory.create();
}
}