🌟 核心概念图解
[函数式接口特征图谱]
┌──────────────┬──────────────────────┐
│ 核心规则 │ 扩展特性 │
├──────────────┼──────────────────────┤
│ ❶ 单抽象方法 │ ❷ 允许默认方法 │
│ │ ❸ 允许静态方法 │
│ │ ❹ 可包含Object公共方法 │
└──────────────┴──────────────────────┘
🔍 解剖Comparator接口
📜 代码示例与注释
@FunctionalInterface
public interface Comparator<T> {
// ❶ 唯一抽象方法(函数式接口核心)
int compare(T o1, T o2);
// ❹ 来自Object的公共方法(不违反规则)
boolean equals(Object obj);
// ❷ 默认方法扩展功能
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
// ❸ 静态方法提供工具
public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {
return Collections.reverseOrder();
}
}
🧩 设计意义解析
单抽象方法 :保证Lambda表达式的简洁性(如(a, b) -> a-b
)默认方法 :实现接口演化不破坏现有代码(如JDK8新增reversed()
)静态方法 :提供工厂方法(如Comparator.comparing()
)Object方法 :避免接口被误判为非函数式接口
🧰 四大核心函数式接口
接口 抽象方法 典型场景 Lambda示例 Function<T,R>
R apply(T t) 数据转换 x -> x.toString()
Consumer<T>
void accept(T t) 遍历消费 s -> System.out.print(s)
Supplier<T>
T get() 延迟生成对象 () -> new Random()
Predicate<T>
boolean test(T t) 条件过滤 n -> n % 2 == 0
💡 进阶特性解析
1️⃣ 方法引用优化
// 静态方法引用
Function<String, Integer> parser = Integer::parseInt;
// 实例方法引用
Consumer<String> printer = System.out::println;
// 构造器引用
Supplier<ArrayList> listFactory = ArrayList::new;
2️⃣ 接口组合技巧
Predicate<String> nonEmpty = s -> !s.isEmpty();
Predicate<String> lengthCheck = s -> s.length() > 5;
// 组合谓词:非空且长度>5
Predicate<String> combined = nonEmpty.and(lengthCheck);
3️⃣ 自定义函数接口
@FunctionalInterface
interface TriFunction<A,B,C,R> {
R apply(A a, B b, C c);
}
// 使用示例:三维坐标转换
TriFunction<Double,Double,Double,Point> pointFactory = Point::new;
⚠️ 常见误区与验证
1️⃣ @FunctionalInterface 验证
// 错误示例:包含两个抽象方法
@FunctionalInterface
interface InvalidInterface {
void method1();
void method2(); // 编译报错
}
2️⃣ Object方法陷阱
@FunctionalInterface
interface ValidInterface {
void execute();
String toString(); // 不违反规则(继承自Object)
boolean equals(Object o); // 允许存在
}
🚀 实战应用场景
1️⃣ Stream API整合
List<String> data = Arrays.asList("apple", "", "banana");
long count = data.stream()
.filter(s -> !s.isEmpty()) // Predicate
.map(String::toUpperCase) // Function
.peek(System.out::println) // Consumer
.count();
2️⃣ GUI事件处理
button.addActionListener(
event -> System.out.println("Button clicked!") // ActionListener是函数式接口
);
3️⃣ 策略模式优化
public class Validator {
private Predicate<String> strategy;
public Validator(Predicate<String> strategy) {
this.strategy = strategy;
}
public boolean validate(String input) {
return strategy.test(input);
}
}
// 使用示例
Validator emailValidator = new Validator(s -> s.contains("@"));
[核心记忆口诀]
一法立根本,默认静态可共存;
Object方法不破规,四大接口记心门。
Lambda化身方法体,组合引用显奇能;
函数编程新时代,简洁优雅破混沌。