版本:基于 Java 17 & Java 21 LTS
如果说面向对象是 Java 的骨架,那么泛型和函数式编程就是 Java 的灵魂。本篇将带你深入理解这两个让代码变得既通用又优雅的核心特性。
1. 泛型进阶 (Generics)
泛型实现了“参数化类型”的概念,使代码可以处理多种数据类型而无需进行强制类型转换,且在编译期就能保证类型安全。
1.1 泛型类与方法
// 泛型类:T 是类型占位符
public class Box<T> {
private T content;
public void set(T content) { this.content = content; }
public T get() { return content; }
}
// 泛型方法
public static <E> void printArray(E[] array) {
for (E element : array) {
System.out.print(element + " ");
}
}1.2 通配符 (Wildcards)
<?>: 无界通配符,表示任何类型。<? extends T>: 上界通配符,表示 T 或 T 的子类(适合读取)。<? super T>: 下界通配符,表示 T 或 T 的父类(适合写入)。
2. Lambda 表达式 (Java 8+)
Lambda 允许我们将函数作为参数传递给方法,极大地简化了匿名内部类的写法。
2.1 语法结构
(参数) -> { 代码块 }
// 传统匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello!");
}
}).start();
// Lambda 简化
new Thread(() -> System.out.println("Hello Lambda!")).start();3. 函数式接口 (Functional Interfaces)
Lambda 的底层基础是函数式接口——只有一个抽象方法的接口。Java 提供了 @FunctionalInterface 注解来标识它们。
3.1 四大内置函数式接口
Predicate<T>:断言型。输入 T,返回 boolean。
Consumer<T>:消费型。输入 T,无返回值。
Function<T, R>:转换型。输入 T,返回 R。
Supplier<T>:供给型。无输入,返回 T。
4. 方法引用 (Method References)
方法引用是 Lambda 的进一步简化,当 Lambda 块中只是调用一个已存在的方法时使用。
静态方法引用:
ClassName::staticMethodName实例方法引用:
instance::methodName对象方法引用:
ClassName::methodName(如String::length)构造器引用:
ClassName::new(如ArrayList::new)
var list = List.of("A", "B", "C");
list.forEach(System.out::println); // 替代 s -> System.out.println(s)本章小结
第八篇我们深度学习了:
泛型的类、方法及通配符的高级用法。
Lambda 表达式的语法及其对代码的简化。
四大核心函数式接口:
Predicate,Consumer,Function,Supplier。方法引用:进一步简化 Lambda 代码的优雅写法。
下一篇预告:Stream API 深度实战 (Filter, Map, Collect, Parallel Streams)