版本:基于 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 四大内置函数式接口

  1. Predicate<T>:断言型。输入 T,返回 boolean。

  2. Consumer<T>:消费型。输入 T,无返回值。

  3. Function<T, R>:转换型。输入 T,返回 R。

  4. 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)

本章小结

第八篇我们深度学习了:

  1. 泛型的类、方法及通配符的高级用法。

  2. Lambda 表达式的语法及其对代码的简化。

  3. 四大核心函数式接口:Predicate, Consumer, Function, Supplier

  4. 方法引用:进一步简化 Lambda 代码的优雅写法。

下一篇预告:Stream API 深度实战 (Filter, Map, Collect, Parallel Streams)