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() 方法,该方法不接受任何参数并返回一个结果。

    Endel.io
    Endel.io

    Endel是一款可以创造个性化舒缓声音的应用程序,可帮助您集中注意力、放松身心和入睡。

    下载

    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

    相关专题

    更多
    java
    java

    Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

    804

    2023.06.15

    java正则表达式语法
    java正则表达式语法

    java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

    723

    2023.07.05

    java自学难吗
    java自学难吗

    Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

    727

    2023.07.31

    java配置jdk环境变量
    java配置jdk环境变量

    Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

    395

    2023.08.01

    java保留两位小数
    java保留两位小数

    Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

    398

    2023.08.02

    java基本数据类型
    java基本数据类型

    java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

    445

    2023.08.02

    java有什么用
    java有什么用

    java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

    428

    2023.08.02

    java在线网站
    java在线网站

    Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

    16861

    2023.08.03

    vlookup函数使用大全
    vlookup函数使用大全

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

    28

    2025.12.30

    热门下载

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

    精品课程

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

    共23课时 | 2.1万人学习

    C# 教程
    C# 教程

    共94课时 | 5.6万人学习

    Java 教程
    Java 教程

    共578课时 | 39.3万人学习

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

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