引言
函数式编程(Functional Programming)在 Java 8 引入后,极大地简化了代码逻辑,提高了可读性和复用性。其中,方法引用(Method Reference)是 Lambda 表达式的一种简洁写法,能够直接引用已有的方法。
本文将通过简单易懂的示例,讲解 Java 中四种常见的函数式编程方法引用类型:
- 静态方法引用
- 实例方法引用
- 特定类型方法引用
- 构造器引用
1. 静态方法引用(Static Method Reference)
静态方法引用指向类的静态方法,语法格式如下:
ClassName::staticMethodName
示例:
import java.util.Arrays;
import java.util.List;
public class StaticMethodReferenceDemo {
public static void printString(String s) {
System.out.println(s);
}
public static void main(String[] args) {
List<String> list = Arrays.asList("Java", "Python", "C++");
list.forEach(StaticMethodReferenceDemo::printString);
}
}
输出:
Java
Python
C++
这里 StaticMethodReferenceDemo::printString 直接引用了静态方法 printString。
2. 实例方法引用(Instance Method Reference)
实例方法引用指向特定对象的实例方法,语法格式如下:
instance::instanceMethodName
示例:
import java.util.Arrays;
import java.util.List;
public class InstanceMethodReferenceDemo {
public void printString(String s) {
System.out.println(s);
}
public static void main(String[] args) {
InstanceMethodReferenceDemo demo = new InstanceMethodReferenceDemo();
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.forEach(demo::printString);
}
}
输出:
Apple
Banana
Cherry
这里通过 demo::printString 引用了 demo 对象的实例方法。
3. 特定类型方法引用(Particular Type Method Reference)
这种方法引用指向某一类对象的任意实例的方法,语法格式如下:
ClassName::instanceMethodName
示例:
import java.util.Arrays;
import java.util.List;
public class SpecificTypeMethodReferenceDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("java", "python", "c++");
list.sort(String::compareToIgnoreCase);
list.forEach(System.out::println);
}
}
输出:
c++
java
python
这里 String::compareToIgnoreCase 表示调用列表中每个 String 对象的 compareToIgnoreCase 方法。
4. 构造器引用(Constructor Reference)
构造器引用用于直接创建对象实例,语法格式如下:
ClassName::new
示例:
import java.util.function.Supplier;
class Person {
private String name;
public Person() {
this.name = "Anonymous";
}
public void showName() {
System.out.println("Name: " + name);
}
}
public class ConstructorReferenceDemo {
public static void main(String[] args) {
Supplier<Person> personSupplier = Person::new;
Person person = personSupplier.get();
person.showName();
}
}
输出:
Name: Anonymous
这里 Person::new 直接引用了 Person 的无参构造器。
总结
通过方法引用,我们可以用更简洁、直观的方式实现 Lambda 表达式的功能。总结四种引用类型:
| 类型 | 语法 | 示例 |
|---|---|---|
| 静态方法引用 | ClassName::staticMethod |
Math::max |
| 实例方法引用 | instance::method |
demo::printString |
| 特定类型方法引用 | ClassName::method |
String::compareToIgnoreCase |
| 构造器引用 | ClassName::new |
Person::new |
掌握方法引用能让你在函数式编程中写出更清晰、高效的 Java 代码。
本文适合 Java 初学者及希望掌握函数式编程方法引用的开发者。