函数式接口是只含一个抽象方法的接口,用于支持Lambda表达式,可通过@FunctionalInterface注解标识,常见内置接口包括Supplier、Consumer、Function、Predicate等,结合Lambda可简化集合操作与函数式编程。
函数式接口是Java 8引入的一个核心概念,主要用于支持Lambda表达式。它指的是**只包含一个抽象方法**的接口,可以有多个默认方法或静态方法。这种接口可以用@FunctionalInterface注解来标识,编译器会检查是否符合函数式接口的定义。
要定义一个函数式接口,只需确保接口中只有一个抽象方法。使用@FunctionalInterface注解可以让代码更清晰,并在违反规则时提示错误。
示例:
@FunctionalInterface
public interface MyFunction {
int apply(int a, int b);
}
这个接口只有一个抽象方法apply,因此是函数式接口。如果再添加一个抽象方法,编译就会报错。
Java 8在java.util.function包中提供了许多常用的函数式接口,适用于大多数场景:
函数式接口结合Lambda表达式,能显著简化代码,特别是在集合操作中。
示例1:使用Consumer遍历集合
List
list.forEach(s -> System.out.println(s));
forEach方法接收一个Consumer,Lambda表达式替代了匿名内部类。
示例2:使用Predicate过滤数据
Predicate
List
List
.filter(isEven)
.collect(Collectors.toList());
通过P
redicate定义筛选条件,使逻辑清晰且可复用。
当内置接口无法满足需求时,可以自定义:
@FunctionalInterface
public interface Calculator {
double calculate(double a, double b);
}
使用方式:
Calculator add = (a, b) -> a + b;
System.out.println(add.calculate(2.0, 3.0)); // 输出5.0
函数式接口是Java实现函数式编程的基础。它让Lambda表达式有了目标类型,使代码更简洁、易读。合理使用内置接口可以避免重复造轮子,而自定义接口则能灵活应对特定业务场景。掌握函数式接口有助于更好地利用Stream API和并发编程中的新特性。
基本上就这些,理解清楚后用起来并不复杂,但容易忽略的是保持接口的“单一抽象方法”原则。只要守住了这一点,函数式接口就能发挥最大作用。