1. 函数式接口的本质与价值
函数式接口是Java 8引入lambda表达式的关键基石。简单来说,它就是仅包含一个抽象方法的接口,但这个简单的定义背后蕴含着深刻的编程范式变革。在传统Java开发中,我们经常需要创建匿名内部类来实现简单的回调逻辑,这导致代码臃肿且意图模糊。函数式接口的出现,使得行为参数化变得优雅而简洁。
重要提示:虽然函数式接口只能有一个抽象方法,但可以包含多个默认方法或静态方法。这是许多初学者容易混淆的地方。
函数式接口最典型的应用场景莫过于集合操作。比如我们要过滤一个用户列表,传统做法需要实现Predicate接口的匿名类,而现在只需一行lambda表达式:
java复制users.stream().filter(u -> u.getAge() > 18).collect(Collectors.toList());
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java内置核心函数式接口解析
2.1 四大基础函数式接口
Java 8在java.util.function包中提供了丰富的内置函数式接口,其中最核心的是以下四个:
-
Consumer
:消费型接口 - 抽象方法:void accept(T t)
- 典型应用:集合遍历
java复制
list.forEach(item -> System.out.println(item)); -
Supplier
:供给型接口 - 抽象方法:T get()
- 典型应用:延迟初始化
java复制Supplier<ExpensiveObject> supplier = () -> new ExpensiveObject(); -
Function<T,R>:函数型接口
- 抽象方法:R apply(T t)
- 典型应用:数据转换
java复制
Function<String, Integer> parser = Integer::parseInt; -
Predicate
:断言型接口 - 抽象方法:boolean test(T t)
- 典型应用:条件过滤
java复制
Predicate<String> isEmpty = s -> s.trim().isEmpty();
2.2 常见变体与组合
Java还提供了这些基础接口的变体,以应对不同场景:
- BiFunction<T,U,R>:接受两个参数的函数
- IntFunction
:接受int参数的函数 - UnaryOperator
:Function的特例,输入输出类型相同
更强大的是,这些接口支持方法组合:
java复制Function<String, Integer> parseThenAdd = ((Function<String, Integer>)Integer::parseInt)
.andThen(i -> i + 10);
