Java四大核心函数式接口详解
Java 8引入了函数式编程的支持,其中四大核心函数式接口(Supplier、Consumer、Function、Predicate)是Lambda表达式和方法引用的基础。这些接口均位于java.util.function包中。
Supplier:无参供给型接口
Supplier<T>表示一个不接收参数但返回结果的供给操作。常用于延迟计算或生成值。
方法签名:
T get();示例:
Supplier<String> randomString = () -> UUID.randomUUID().toString(); System.out.println(randomString.get()); // 输出随机UUID字符串典型场景:
- 惰性初始化或缓存
- 工厂模式生成对象
Consumer:单参消费型接口
Consumer<T>接收一个参数但不返回结果,用于消费数据。
方法签名:
void accept(T t);默认方法:
default Consumer<T> andThen(Consumer<? super T> after)示例:
Consumer<String> printUpperCase = s -> System.out.println(s.toUpperCase()); printUpperCase.accept("hello"); // 输出"HELLO" // 链式调用 Consumer<String> printAndLog = printUpperCase.andThen(s -> System.out.println("Logged: " + s)); printAndLog.accept("world");典型场景:
- 集合遍历(如
List.forEach) - 日志记录或通知
Function:单参转换型接口
Function<T, R>接收一个参数并返回结果,用于数据转换。
方法签名:
R apply(T t);默认方法:
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) default <V> Function<V, R> compose(Function<? super V, ? extends T> before)示例:
Function<String, Integer> parseToInt = Integer::parseInt; int num = parseToInt.apply("123"); // 返回123 // 链式调用 Function<String, String> toUpperAndTrim = s -> s.toUpperCase().trim(); Function<String, Integer> pipeline = toUpperAndTrim.andThen(String::length); int length = pipeline.apply(" abc "); // 返回3典型场景:
- 数据转换(如字符串处理)
- Stream API中的
map操作
Predicate:单参断言型接口
Predicate<T>接收一个参数并返回布尔值,用于条件判断。
方法签名:
boolean test(T t);默认方法:
default Predicate<T> and(Predicate<? super T> other) default Predicate<T> or(Predicate<? super T> other) default Predicate<T> negate()示例:
Predicate<String> isLong = s -> s.length() > 5; boolean result = isLong.test("hello world"); // 返回true // 组合条件 Predicate<String> isLongAndStartsWithH = isLong.and(s -> s.startsWith("h")); boolean combinedResult = isLongAndStartsWithH.test("hello"); // 返回false典型场景:
- 集合过滤(如
Stream.filter) - 验证逻辑(如参数校验)
总结对比
| 接口 | 方法签名 | 输入参数 | 返回值 | 典型用途 |
|---|---|---|---|---|
Supplier<T> | T get() | 无 | T | 生成值 |
Consumer<T> | void accept(T) | T | 无 | 消费数据 |
Function<T,R> | R apply(T) | T | R | 数据转换 |
Predicate<T> | boolean test(T) | T | boolean | 条件判断 |
通过灵活组合这些接口,可以显著减少样板代码并提升代码可读性。