函数式接口和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 的底层基础。

相关推荐
知无不研8 天前
lambda表达式的使用(3)
开发语言·c++·lambda
ShineWinsu9 天前
对于C++:C++11中lambda、function、bind的解析
c++·面试·笔试·开发·lambda·bind·function
折哥的程序人生 · 物流技术专研1 个月前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
小bo波2 个月前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
devilnumber2 个月前
Lambda|行为参数化 完整精讲
java·lambda·行为参数化
递归尽头是星辰2 个月前
大数据架构体系通识:存储、架构与数仓分层全解析
lambda·湖仓一体·大数据架构·kappa·数据仓库分层
拾光Ծ3 个月前
C++11实用的新特性:lambda表达式与包装器function与bind
c++·c++11·lambda·bind·function·函数包装器
devilnumber3 个月前
java的lambda妙用举例
java·lambda
devilnumber3 个月前
如何在java的Lambda中安全地修改外部变量?
java·安全·lambda