函数式接口简介
java.util.function 是 Java 8 专门为 Lambda / Stream 提供的函数式接口包,一共只有 4 大类核心接口,剩下全是它们的变形。
一、4 个核心函数式接口
1. Supplier 提供者
- 抽象方法:
T get() - 作用:无入参,返回一个结果(造数据、懒加载)
- 示例:
Supplier<String> supplier = () -> "hello"; String s = supplier.get();
2. Consumer 消费者
- 抽象方法:
void accept(T t) - 作用:接收一个参数,不返回值(消费、打印、修改、存库)
- 示例:
Consumer<String> consumer = System.out::println; consumer.accept("test");
3. Function<T, R> 函数
- 抽象方法:
R apply(T t) - 作用:接收一个参数,返回一个结果(转换、映射)
- 示例:
Function<String, Integer> fun = String::length; int len = fun.apply("abc");
4. Predicate 断言/判断
- 抽象方法:
boolean test(T t) - 作用:接收参数,返回布尔值(过滤、条件判断)
- 示例:
Predicate<String> pred = s -> s.length() > 3; boolean b = pred.test("abcd");
二、常用变形(记住规律即可)
1. 两个参数的版本
- BiConsumer<T, U>:
void accept(T, U) - BiFunction<T, U, R>:
R apply(T, U) - BiPredicate<T, U>:
boolean test(T, U)
2. 基本数据类型优化(避免装箱)
IntFunction<R>、LongFunction<R>、DoubleFunction<R>ToIntFunction<T>、ToLongFunction<T>IntConsumer、LongConsumer、IntPredicate等
3. 输入输出同类型
- UnaryOperator:继承 Function,
T apply(T t)(一元运算) - BinaryOperator:继承 BiFunction,
T apply(T t, T u)(二元运算,如求和)
三、对应 Stream 里的用法(最实用)
| 接口 | Stream 方法 | 作用 |
|---|---|---|
| Predicate | filter() | 过滤 |
| Function<T, R> | map() | 映射转换 |
| Consumer | forEach()/peek() | 遍历消费 |
| Supplier | generate() | 生成流数据 |
| BinaryOperator | reduce() | 聚合计算 |
四、一句话总结
- Supplier:无中生有
- Consumer:只进不出
- Function:有进有出(转换)
- Predicate:判断真假

浙公网安备 33010602011771号