吃技厦步一、函数式接口的定义函数式接口 Functional Interface 是Java 8引入的核心概念它是指有且仅有一个抽象方法的接口可包含默认方法和静态方法。这种接口可以用Lambda表达式或方法引用来实现是函数式编程在Java中的基础。// 标准定义FunctionalInterface // 编译期检查可选但推荐public interface MyFunction {String apply(int x); // 唯一的抽象方法// 允许默认方法default void print(String msg) {System.out.println(msg);}// 允许静态方法static void log(String msg) {System.out.println([LOG] msg);}}二、渐进式学习——代码示例2.1 阶段1从匿名类到Lambda演化public class EvolutionDemo {public static void main(String[] args) {List names Arrays.asList(Alice, Bob, Charlie);// 【传统方式】匿名内部类names.forEach(new Consumer() {Overridepublic void accept(String name) {System.out.println(name);}});// 【方式1】Lambda完整语法names.forEach((String name) - {System.out.println(name);});// 【方式2】Lambda简化参数类型推导names.forEach((name) - System.out.println(name));// 【方式3】Lambda最简单参数可省括号names.forEach(name - System.out.println(name));// 【方式4】方法引用终极简化names.forEach(System.out::println);}}2.2 阶段2Java内置的四大核心函数式接口精讲1. Consumer - 消费型接口FunctionalInterfacepublic interface Consumer {void accept(T t);}作用接收一个参数不返回结果示例// 打印字符串Consumer printer s - System.out.println(s);printer.accept(Hello, Consumer!);// 消费列表元素List names Arrays.asList(Alice, Bob, Charlie);names.forEach(name - System.out.println(Hello, name));2. Supplier- 供给型接口FunctionalInterfacepublic interface Supplier {T get();}作用不接收参数返回一个结果示例// 生成随机数Supplier randomSupplier () - Math.random();System.out.println(Random: randomSupplier.get());// 延迟初始化Supplier lazyString () - {System.out.println(Initializing...);return Lazy Value;};System.out.println(Before get);System.out.println(lazyString.get());3. Function - 函数型接口FunctionalInterfacepublic interface Function {R apply(T t);}作用接收一个参数返回一个结果示例// 字符串转整数Function stringToInt s - Integer.parseInt(s);int result stringToInt.apply(123);System.out.println(Result: result);// 函数组合Function doubleIt x - x * 2;Function addOne x - x 1;Function composed doubleIt.andThen(addOne);System.out.println(Composed: composed.apply(5)); // 输出: 114. Predicate - 断言型接口FunctionalInterfacepublic interface Predicate {boolean test(T t);}作用接收一个参数返回布尔值示例// 判断字符串是否为空Predicate isEmpty s - s null || s.isEmpty();System.out.println(Is empty: isEmpty.test()); // true// 过滤列表List numbers Arrays.asList(1, 2, 3, 4, 5, 6);List evenNumbers numbers.stream().filter(n - n % 2 0).collect(Collectors.toList());System.out.println(Even numbers: evenNumbers); // [2, 4, 6]2.3 阶段3自定义函数式接口实践// 定义业务相关的函数式接口FunctionalInterfaceinterface OrderValidator {boolean validate(Order order);// 默认方法组合验证default OrderValidator and(OrderValidator other) {return order - this.validate(order) other.validate(order);}}// 使用自定义接口public class CustomFunctionalInterface {public static void main(String[] args) {List orders createOrders();// 定义验证规则OrderValidator isActive Order::isActive;OrderValidator isHighValue o - o.getAmount() 1000;// 组合验证利用默认方法OrderValidator combined isActive.and(isHighValue);// 应用验证orders.stream().filter(combined::validate) // 方法引用.forEach(o - System.out.println(Valid: o));}}2.4 阶段4方法引用与构造函数引用public class ReferenceDemo {public static void main(String[] args) {List names Arrays.asList(Tom, Jerry);// 1. 静态方法引用类名::静态方法names.stream().map(String::toUpperCase) // 等价于 s - s.toUpperCase().forEach(System.out::println);// 2. 实例方法引用对象::实例方法String prefix Name: ;names.forEach(s - System.out.println(prefix s));// 3. 构造函数引用类名::newSupplier listSupplier ArrayList::new;List newList listSupplier.get();// 4. 数组构造函数引用类型[]::newIntFunction arrayCreator String[]::new;String[] array arrayCreator.apply(5); // 创建长度为5的数组}}2.5 阶段5Stream API中的函数式接口应用public class StreamFunctionalDemo {public static void main(String[] args) {List employees Arrays.asList(new Employee(Alice, 8000, Tech),new Employee(Bob, 12000, Tech),new Employee(Charlie, 7000, HR));// 综合案例分组、过滤、转换Map result employees.stream().filter(e - e.getSalary() 7500) // Predicate.map(Employee::getName) // Function.collect(Collectors.groupingBy(name - name.substring(0, 1) // Function));System.out.println(result); // {A[Alice], B[Bob]}}}2.6 综合实战案例// 构建一个函数式风格的订单处理系统public class OrderProcessor {// 核心用函数式接口定义可组合的业务规则private final Function taxCalculator;private final Predicate validationRule;private final Consumer auditLogger;// 构造函数注入行为public OrderProcessor(Function taxCalculator,Predicate validationRule,Consumer auditLogger) {this.taxCalculator taxCalculator;this.validationRule validationRule;this.auditLogger auditLogger;}public void process(List orders) {orders.stream().filter(validationRule) // 验证.peek(auditLogger) // 记录日志.map(order - { // 计算税后价格double tax taxCalculator.apply(order);order.setFinalPrice(order.getAmount() tax);return order;}).forEach(order - System.out.println(处理完成: order));}public static void main(String[] args) {// 配置不同的业务规则OrderProcessor domesticProcessor new OrderProcessor(order - order.getAmount() * 0.1, // 10%税Order::isActive, // 仅处理激活订单o - System.out.println(审计: o.getId()));domesticProcessor.process(createOrders());}}三、总结在四大核心函数式函数式接口的基础上还有BiFunction - 双参数转换、UnaryOperator - 一元操作、BinaryOperator - 二元操作。简单来说UnaryOperator和BinaryOperator并非新的概念而是两大核心函数式接口的“特化”或“简化版”。它们与四大核心函数接口的关系是包含与被包含的关系而非并列关系。接口类型 方法签名 用途 示例Consumer void accept(T t) 消费数据 forEachSupplier T get() 提供数据 延迟初始化Function R apply(T t) 数据转换 mapPredicate boolean test(T t) 条件判断 filterBiFunction R apply(T t, U u) 双参数转换 合并操作UnaryOperator T apply(T t) 一元操作 字符串处理BinaryOperator T apply(T t1, T t2) 二元操作 数学运算Function和 BiFunction? 是基础且通用的转换接口适用于各种复杂的类型转换场景。UnaryOperator和 BinaryOperator? 是前两者的特殊形式专门用于输入输出类型一致的特定场景使代码意图更明确。如果有需要也可以使用FunctionalInterface注解来定制契合某个业务的函数式接口。