Java函数式接口详解

一、函数式接口的定义

函数式接口(Functional Interface)是Java 8引入的核心概念,指仅包含一个抽象方法 的接口。这类接口可通过@FunctionalInterface注解显式声明,例如:

java 复制代码
@FunctionalInterface
public interface MyFunction {
    void execute(String message);
}

编译器会对带有此注解的接口进行抽象方法数量校验,若不符合要求则报错。

二、函数式接口的意义
  1. Lambda表达式支持
    函数式接口是Lambda表达式的类型载体。例如实现Runnable接口的传统方式:
java 复制代码
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("传统实现");
    }
}).start();

Lambda简化后:

java 复制代码
new Thread(() -> System.out.println("Lambda实现")).start();

此处Runnable接口的抽象方法run()与Lambda表达式签名匹配。

  1. 方法引用绑定
    函数式接口支持通过::操作符绑定已有方法:
java 复制代码
Consumer<String> printer = System.out::println;
printer.accept("方法引用示例");
三、Java内置核心函数式接口

Java 8在java.util.function包中提供了四大基础接口:

接口类型 抽象方法 典型应用场景
Consumer<T> void accept(T t) 参数消费(如打印)
Supplier<T> T get() 数据提供(如工厂)
Function<T,R> R apply(T t) 数据转换(如映射)
Predicate<T> boolean test(T t) 条件判断(如过滤)

示例:使用Predicate过滤集合

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evens = numbers.stream()
                             .filter(n -> n % 2 == 0) // Predicate实现
                             .collect(Collectors.toList());
四、自定义函数式接口实践
  1. 定义接口
java 复制代码
@FunctionalInterface
interface StringProcessor {
    String process(String input);
}
  1. Lambda实现
java 复制代码
StringProcessor toUpper = s -> s.toUpperCase();
System.out.println(toUpper.process("hello")); // 输出"HELLO"
五、技术要点总结
  1. 函数式接口是Java函数式编程的基石,支持Lambda和方法引用
  2. 内置接口覆盖了90%的常见场景,优先考虑复用
  3. 自定义接口需严格遵循单抽象方法原则
  4. 结合Stream API可实现声明式数据处理

:Java 8允许函数式接口包含default方法和static方法,这些不影响其作为函数式接口的特性。

相关推荐
学长毕业设计2 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西2 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西2 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午2 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065252 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
小范同学_2 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
予昊3 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
2601_962203514 小时前
【SpringAI入门】初识SpringAI
java
weixin_461408584 小时前
Mybatis-flex小记
java·开发语言·mybatis
2601_962177134 小时前
【MySQL篇】聚合查询,联合查询
android·java·mysql