函数式接口和lambda表达式

函数式接口的作用

函数式接口:只有一个抽象方法的接口(可以有默认方法、静态方法),注解 @FunctionalInterface 标识 核心:把函数(行为)当成数据来传递,支持 Lambda 表达式

1. 核心作用

  1. 支持 Lambda 表达式 Lambda 本身没有类型,需要函数式接口作为它的目标类型。 Lambda 就是实现这个接口那唯一的抽象方法。
java 复制代码
@FunctionalInterface
interface MyFunc {
    void run();
}
// lambda 直接实现唯一抽象方法
MyFunc f = () -> System.out.println("hello");
f.run();
  1. 行为参数化(把业务逻辑当参数传) 传统写法:方法只能传对象、基本类型; 函数式接口可以把一段逻辑 / 行为作为参数传入方法,同一个方法,传入不同 lambda,执行不同逻辑。

示例:集合过滤,过滤规则作为参数

java 复制代码
list.stream().filter(x -> x>10).collect(Collectors.toList());
// filter 参数就是 Predicate 函数式接口
  1. 简化回调、模板代码 不用写一大堆匿名内部类,替代臃肿的匿名内部类。
java 复制代码
// 旧:匿名内部类
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("任务");
    }
});

// 新:lambda,Runnable就是函数式接口
new Thread(()-> System.out.println("任务"));

2.JDK 内置四大核心函数式接口

接口 抽象方法 作用
Consumer<T> void accept(T t) 消费型:接收参数,无返回值
Supplier<T> T get() 供给型:无参数,返回数据
Function<T,R> R apply(T t) 函数型:接收 T,返回 R,转换数据
Predicate<T> boolean test(T t) 断言型:接收 T,返回 boolean 做判断

3. 补充要点

  1. @FunctionalInterface 只是校验注解,不加,只要接口只有一个抽象方法,依然是函数式接口;加上强制编译校验。
  2. Object 类的方法(equals、toString)不算抽象方法计数
  3. Stream 流式编程大量依赖函数式接口,这是它的底层基础。

4. 一句话总结

函数式接口就是给 Lambda 提供类型载体,实现行为参数化,把逻辑行为当作参数传递,简化代码,是 Stream、Lambda 的底层基础。

相关推荐
Cry丶4 天前
第四篇:Block、Proc、Lambda 与 `yield`
ruby·lambda·block·yield·闭包·proc
洋不写bug11 天前
绕过权限检查,访问修改私有属性,反射,枚举,lambda
java·枚举·lambda·反射
StarRocks_labs15 天前
StarRocks x Fluss x Paimon 湖流一体方案:构建秒级响应、湖流一体的实时数据引擎
starrocks·kafka·lambda·查询·paimon·fluss·湖流一体
asdfg125896320 天前
一个例子理解Java中的函数式接口
java·函数式接口
知无不研1 个月前
lambda表达式的使用(3)
开发语言·c++·lambda
ShineWinsu1 个月前
对于C++:C++11中lambda、function、bind的解析
c++·面试·笔试·开发·lambda·bind·function
折哥的程序人生 · 物流技术专研2 个月前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
小bo波3 个月前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
devilnumber3 个月前
Lambda|行为参数化 完整精讲
java·lambda·行为参数化