0

0

Java8中需要知道的函数式接口有哪些

PHPz

PHPz

发布时间:2023-05-04 18:34:07

|

2156人浏览过

|

来源于亿速云

转载

    前言

    java 8 中提供了许多函数式接口,包括function、consumer、supplier、predicate 等等。它们都位于 java.util.function 包下。

    Java8中需要知道的函数式接口有哪些

    为什么需要知道这几个函数式接口

    因为这 4 个函数式接口是 Java 8 中新增的重要接口,同时 Java 8 的 Stream 新特性,也有用到这些接口,所以学习它们可以帮助我们更好地理解 Stream 流。

    也正因为这是函数式接口,所以就可以使用 Lambda 表达式来写接口的实现逻辑。而且学习的过程中可以更好地理解函数式编程的思想。

    Function 接口

    说明

    Function 这个单词的意思就有「函数」的意思,就数学中的 y = f(x),接收一个 x 参数,通过函数 f 运算后,返回一个结果 y。

    立即学习Java免费学习笔记(深入)”;

    Function 接口包含四个方法:

    • apply(T t):这是 Function 接口的主要方法,它接收一个参数并返回一个结果。同时它也是唯一的抽象的方法,剩下的都是有默认实现的(Java 8 中接口的抽象方法支持默认实现)。

    • andThen(Function after):作用是将两个 Function 组合。首先执行当前函数,再执行 andThen 函数,并将当前函数的结果作为参数传递给 andThen 函数。

    • compose(Function before):同理,将两个 Function 组合,将先执行 compose 函数,再执行当前函数,并将 compose 函数的结果作为参数传递给当前函数。

    • identity(): 返回一个执行恒等转换的函数,即返回输入参数本身。

    Function 接口通常用于将一个类型的值转换为另一个类型的值。

    apply 方法

    // Function 接口的泛型,第一个参数是入参类型,第二个参数是出参类型
    // Function 接口只有一个抽象方法,就是 apply(),下面利用 Lambda 表达式实现这个抽象方法并创建 Function 对象
    Function function = num -> "GTA" + num;
    // 将5这个参数传递给function,得到返回结果
    String result = function.apply(5);
    System.out.println(result); // 打印:GTA5

    andThen 和 compose 方法

    // 定义两个 Function 对象进行相关转换操作
    Function upperCase = s -> s.toUpperCase();
    Function addPostfix = s -> s + "5";
    // 链式调用,将 gta 这个字符串参数先传递 upperCase 这个函数进行操作,然后将得到的结果传递给 addPostfix 函数进行操作,得到返回结果
    String str = upperCase.andThen(addPostfix).apply("gta");
    System.out.println(str); // 打印:GTA5

    identify 方法

    identity 方法返回一个执行恒等转换的函数,该函数将输入参数原样返回。例如:

    Function identity = Function.identity();
    String result = identity.apply("hello"); // result is "hello"

    Consumer 接口

    说明

    Consumer 这个单词的意思就有「消费者」的意思,就把入参消费了,并不会返回结果给你。

    Consumer 接口包含两个方法:

    • accept(T t):该方法接受一个参数并执行一些操作。

    • andThen(Consumer after):同理,将两个 Consumer 组合,先后进行消费。

    accept 方法

    Consumer 接口通常用于消费一个参数然后执行一些操作。例如:

    // Consumer 接口,泛型参数是入参类型,接受一个参数,并不返回结果,相当于消费了这个参数
    Consumer consumer = s -> System.out.println(s);
    consumer.accept("我输入什么就打印什么"); // 打印:我输入什么就打印什么

    andThen 方法

    组合两个 Consumer:

    Consumer first = s -> System.out.println(s + 5);
    Consumer second = s -> System.out.println(s + 6);
    // 先执行 first 这个 Consumer,接着执行 second 这个 Consumer
    Consumer combination = first.andThen(second);
    combination.accept("GTA"); // 打印:GTA5 GTA6

    Supplier 接口

    Supplier 接口只定义了一个 get() 方法,该方法不接受任何参数并返回一个结果。

    万兴喵影
    万兴喵影

    国产剪辑神器

    下载

    Supplier 这个单词的意思就有「供应者」的意思,给我的感觉就是生产者,不用参数,直接生产一个东西给你。

    Supplier 接口通常用于生成一个值。例如:

    // Supplier 接口,泛型参数是出参类型,不接受参数,但是会提供结果,相当于生产了某个东西
    Supplier supplier = () -> "提供一个我随便打的字符串给调用方";
    String text = supplier.get();
    System.out.println(text); // 打印:提供一个我随便打的字符串给调用方

    Predicate 接口

    说明

    Predicate 这个单词的意思就有「预言,预测,谓语,谓词」的意思,就是用来预测判断的。

    Predicate 接口包含四个方法:

    • test(T t):该方法接受一个参数并返回一个布尔值

    • and(Predicate other):与另一个 Predicate 进行组合,实现逻辑与操作。

    • negate():与另一个 Predicate 进行组合,实现逻辑非操作。

    • or(Predicate other):与另一个 Predicate 进行组合,实现逻辑或操作。

    test方法

    Predicate 接口通常用于测试一个条件是否成立。例如:

    // Predicate 接口,泛型参数是入参类型,返回布尔值
    Predicate predicate = s -> s.contains("god23bin");
    boolean flag = predicate.test("god23bin能给你带来收获吗?");
    System.out.println("god23bin能给你带来收获吗?" + flag); // 打印:god23bin能给你带来收获吗?true

    and 方法

    为了便于演示,这里准备两个 Predicate:

    Predicate startsWithA = (str) -> str.startsWith("A"); // 如果传入的字符串是A开头,则返回 true
    Predicate endsWithZ = (str) -> str.endsWith("Z"); // 如果传入的字符串是Z结尾,则返回 true

    使用 and 进行组合,操作:

    Predicate startsWithAAndEndsWithZ = startsWithA.and(endsWithZ);
    System.out.println(startsWithAAndEndsWithZ.test("ABCDEFZ")); // true
    System.out.println(startsWithAAndEndsWithZ.test("BCDEFGH")); // false

    negate 方法

    使用 negate 进行组合,操作:

    Predicate notStartsWithA = startsWithA.negate();
    System.out.println(notStartsWithA.test("ABCDEF")); // false
    System.out.println(notStartsWithA.test("BCDEFGH")); // true

    or 方法

    使用 or 进行组合,操作:

    Predicate startsWithAOrEndsWithZ = startsWithA.or(endsWithZ);
    System.out.println(startsWithAOrEndsWithZ.test("ABCDEF")); // true
    System.out.println(startsWithAOrEndsWithZ.test("BCDEFGH")); // false

    那这些接口有什么应用呢

    在 Stream 流中就有应用上这些函数式接口。当然,当你有相似的需求时,你自己也可以应用上这些接口。下面说下 Stream 流中的应用。

    Function 接口:例如 map 方法,map 方法就是将一个类型的值转换为另一个类型的值。

    // map 方法,将 T 类型的值转换成 R 类型的值
    // R 是返回的 Stream 流的元素类型,T 是原先 Stream 流的元素类型
     Stream map(Function mapper);

    Consumer 接口:例如 forEach 方法

    // forEach 方法,遍历 Stream 流中的元素,T 类型是 Stream 流的元素类型
    void forEach(Consumer action);

    Supplier 接口:例如 generate 方法

    // 生成一个无限长度的 Stream 流
    public static Stream generate(Supplier s) {
        Objects.requireNonNull(s);
        return StreamSupport.stream(
            new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);
    }

    Predicate 接口:例如 filter 方法,使用 Predicate 进行过滤操作。

    // 过滤出 Stream 流中,判断结果为 true 的元素
    Stream filter(Predicate predicate);

    相关文章

    java速学教程(入门到精通)
    java速学教程(入门到精通)

    java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    php中foreach用法
    php中foreach用法

    本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

    76

    2025.12.04

    lambda表达式
    lambda表达式

    Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

    208

    2023.09.15

    python lambda函数
    python lambda函数

    本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

    191

    2025.11.08

    Python lambda详解
    Python lambda详解

    本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

    55

    2026.01.05

    硬盘接口类型介绍
    硬盘接口类型介绍

    硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

    1159

    2023.10.19

    PHP接口编写教程
    PHP接口编写教程

    本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

    215

    2025.10.17

    php8.4实现接口限流的教程
    php8.4实现接口限流的教程

    PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2066

    2025.12.29

    java接口相关教程
    java接口相关教程

    本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

    23

    2026.01.19

    2026赚钱平台入口大全
    2026赚钱平台入口大全

    2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

    54

    2026.01.31

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Kotlin 教程
    Kotlin 教程

    共23课时 | 3.1万人学习

    C# 教程
    C# 教程

    共94课时 | 8.1万人学习

    Java 教程
    Java 教程

    共578课时 | 54.1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号