
大家好我是你们的技术小编。今天我们要聊一个Java开发者绕不开的话题——函数式接口Functional Interface。自从Java 8引入Lambda表达式函数式接口就成了我们写简洁、优雅代码的利器。但你真的了解它所有的“家庭成员”吗图1别急这篇文章帮你一次性理清建议收藏起来随时查阅。一、什么是函数式接口简单说函数式接口就是只有一个抽象方法的接口。你可以用 FunctionalInterface 注解来标记它虽然不强制但推荐加上编译器会帮你检查。FunctionalInterfacepublicinterfaceMyFunction{voiddoSomething();// 唯一抽象方法}有了它我们就可以用Lambda表达式或方法引用来实现这个接口代码瞬间清爽很多。二、Java 8之前已有的“老牌”函数式接口其实早在Java 8之前JDK里就已经有不少符合“单抽象方法”条件的接口了。Java 8之后它们也正式成为函数式接口可以直接配合Lambda使用。来看看你用过哪些接口 用途Runnable 线程任务无参无返Callable 异步任务有返回值Comparator 排序比较器FileFilter 文件过滤ActionListener GUI事件监听InvocationHandler 动态代理处理器这些老朋友现在都可以用Lambda来写了比如newThread(()-System.out.println(跑起来)).start();三、Java 8新增核心java.util.function四大天王Java 8在 java.util.function 包中新增了四十多个函数式接口但万变不离其宗最基础的就是下面这四个接口 方法 作用 比喻Consumer void accept(T t) 接受一个参数无返回值 ️ 消费者Supplier T get() 无参数返回一个结果 供应商FunctionT,R R apply(T t) 接受一个参数返回一个结果 转换器Predicate boolean test(T t) 接受一个参数返回布尔值 ✅ 断言举个栗子// Consumer打印ConsumerStringprinters-System.out.println(s);printer.accept(Hello);// Supplier生成随机数SupplierDoublerandom()-Math.random();System.out.println(random.get());// Function字符串转长度FunctionString,IntegerlengthString::length;System.out.println(length.apply(Java));// Predicate判断是否为空PredicateStringisEmptyString::isEmpty;System.out.println(isEmpty.test());四、扩展接口双参数、基本类型、操作符等光有四个核心还不够为了减少自动装箱拆箱的性能损耗以及支持更多场景java.util.function 提供了丰富的变种。双参数版本Bi系列BiConsumerT,U、BiFunctionT,U,R、BiPredicateT,UBinaryOperator两个同类型参数返回同类型BiFunctionInteger,Integer,Integeradd(a,b)-ab;基本类型特化避免装箱比如 IntConsumer、LongSupplier、DoublePredicate……专门处理 int、long、double效率更高。3. 操作符OperatorUnaryOperatorT一个参数返回同类型是 Function 的特例 IntUnaryOperator、DoubleBinaryOperator 等专门针对基本类型。类型转换To系列ToIntFunction、ToDoubleFunction 等把对象转为基本类型。其他特殊用途BooleanSupplier返回 booleanObjIntConsumer接受一个对象和一个 int完整列表你可以在 IDE 中查看 java.util.function 包或者翻阅 Oracle官方文档。五、实战小贴士✅ 什么时候用哪个需要消费数据不返回Consumer 需要提供数据Supplier 需要转换类型Function 需要条件过滤Predicate✅ 优先使用标准接口不要重复造轮子能用 java.util.function 里的就用减少自定义接口。✅ 注意 FunctionalInterface加上注解让意图更清晰也能避免误加多余方法。六、写在最后函数式接口是Java函数式编程的基石掌握它们你就能更流畅地使用Stream流、Optional、CompletableFuture等高级特性。本文把常见的函数式接口都梳理了一遍建议点赞、在看、转发三连让更多小伙伴受益你平时最常用哪个函数式接口欢迎留言区聊聊我们下期见