当前位置:

首页 > 编程开发 > Java8中需要知道的函数式接口有哪些

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

前言Java8中提供了许多函数式接口,包括Function、Consumer、Supplier、Predicate等等。它们都位于java.util.function包下。为什么需要知道这几个函数式接口因为这4个函数式接口是Java8中新增的重要接口,同时Java8的Stream新特性,也有用到这些接口,所以学习它们可以帮助我们更好地理解Stream流。也正因为这是函数式接口,所以就可以使用Lambda表达式来写接口的实现逻辑。而且学习的过程中可以更好地理解函数式编程的思想。Function接口说明Fun

本文目录

      前言

      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。

      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);
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。