当前位置: 首页 > news >正文

【Java】Java8的4个函数式接口简单教程

什么是函数是接口?

函数式接口是一个包含 单个抽象方法 的接口,且可以有任意多个默认方法或静态方法。为了增强可读性,Java 8 引入了 @FunctionalInterface 注解,用于标识该接口是一个函数式接口,编译器会帮助我们检查是否符合函数式接口的规范。

今天我们还讲讲Consumer、Supplier、Predicate、Function这几个接口的用法,在 Java8 的用法当中,这几个接口虽然没有明目张胆的使用,但是,却是润物细无声,在许多框架,工具类,方法参数都频频出现。

这几个接口都在java.util.function包下的,分别是

  • Consumer(消费型)
  • supplier(供给型)
  • predicate(谓词型)
  • function(功能性)

Consumer

Consumer 是 Java 8 中引入的一个函数式接口,位于 java.util.function 包中,主要用于表示一个接受单个输入参数但没有返回值的操作(类似于执行某种“消费”行为)。

可以理解为:参数被消费了,石沉大海了

接口定义

  • 泛型 T:表示输入的参数类型。
  • accept(T t) 方法:定义了消费操作。

核心特点

  • 单输入、无返回值:适用于只需要处理输入而不需要返回结果的场景。
  • 支持链式调用:通过 andThen 方法可以组合多个 Consumer

注意事项

不可变性:Consumer没有返回值,因此不能直接将结果传递给下一个操作

慎用副作用:避免在Consumer中引入全局变量修改等副作用代码

常见用法

1.基本用法

2.结合andThen链式调用

功能:按顺序组合两个 Consumer,前一个完成后调用下一个。

3.结合集合操作

Consumer 常用于集合元素的处理。

4.与forEach结合

ConsumerforEach 的核心参数类型:

5.结合Stream API

Consumer 可用于 Stream 中的终端操作 forEach

6.自定义操作

Consumer 可用于封装复杂逻辑:

Supplier

Supplier 接口是 Java 8 引入的一个函数式接口,属于 java.util.function 包。它的主要作用是提供一个没有输入参数的结果Supplier 接口的核心方法是 get(),该方法用于返回一个结果。

理解:空手套白狼,只索取,不付出,供给型接口

接口定义

get()方法,可以看到,是return一个变量

常见用法

1.基本用法

可以通过 Lambda 表达式或方法引用来创建 Supplier 实例。

2.与Stream API结合使用

Supplier 可以与 Java Stream API 结合使用,生成流中的元素。

3.作为方法参数

Supplier 可以作为方法参数传递,允许调用者定义生成对象的逻辑。

4.结合Optional使用
Optional<String> optionalString = Optional.ofNullable(null);
String result = optionalString.orElseGet(() -> "Default Value");
System.out.println(result); // 输出: Default Value

predicate

Predicate 接口是 Java 8 引入的一个函数式接口,位于 java.util.function 包中。它的主要作用是用于测试某个条件,返回布尔值Predicate 接口定义了一个抽象方法 test,接受一个输入参数并返回一个布尔值。

接口定义

常见用法

1.基本用法

2.组合Predicate API

Predicate接口还提供了几个默认方法,允许组合多个Predicate实例

  • and(Predicate other): 连接两个 Predicate,只有在两个 Predicate 都为 true 时,结果才为 true
  • or(Predicate other): 连接两个 Predicate,只要其中一个为 true,结果就为 true
  • negate(): 反转 Predicate 的结果。

3.用于过滤集合

Predicate常用于集合的过滤操作,特别是与 Stream API 配合使用。你可以使用 filter 方法对集合进行筛选。

4.自定义Predicate

也可以创建自己的 Predicate 实现

function

Java 8 中的 Function<T, R> 接口是四大核心函数式接口之一,它用于表示接收一个类型为 T 的参数并返回类型为 R 的结果的操作。

接口定义

常用方法

1.基本用法

2.组合Function API

Function 接口提供了两个常用的默认方法:andThen()compose(),还有identity(),可以用来组合多个函数

andThen() 方法用来链式调用

compose() 方法与 andThen() 的区别在于它先应用传入的 Function,再应用当前的 Function

一句话总结:这俩方法是相反的

identity() 方法返回一个始终返回其输入参数的函数

identity() 方法在流的处理过程中也有应用,尤其是当我们希望原样返回一个对象时非常有用。

Function<Integer, Integer> identityFunction = Function.identity();
System.out.println(identityFunction.apply(10));  // 输出 10

3.与其他函数式接口组合

Function 接口常常与其他函数式接口配合使用,特别是在流(Streams)处理时,能够大大提升代码的简洁性和可读性。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave", "Eve");
List<String> longNames = names.stream().filter(name -> name.length() > 3)  // 先筛选长度大于 3 的名字.map(name -> name.toUpperCase())    // 将符合条件的名字转成大写.collect(Collectors.toList());
System.out.println(longNames);  // 输出 [ALICE, CHARLIE, DAVE]

相关文章:

【Java】Java8的4个函数式接口简单教程

什么是函数是接口&#xff1f; 函数式接口是一个包含 单个抽象方法 的接口&#xff0c;且可以有任意多个默认方法或静态方法。为了增强可读性&#xff0c;Java 8 引入了 FunctionalInterface 注解&#xff0c;用于标识该接口是一个函数式接口&#xff0c;编译器会帮助我们检查…...

计算机组成原理与系统结构——微程序控制

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 基本概念 微指令 将控制单元实现为基本逻辑单元之间的互连并非易事&#xff0c;且设计相对呆板&#xff0c;难以灵活地改变&#xff0c;因此实现微程序控制…...

【Swift】集合类型 - 数组、集合、字典

文章目录 集合的可变性数组数组类型简写语法创建空数组使用默认值创建数组通过合并两个数组创建一个新数组使用数组字面量创建数组访问和修改数组 Swift 提供了三种主要的 集合类型&#xff0c;分别是数组、集合和字典&#xff0c;用于存储值集合。数组是有序的值集合。集合是无…...

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域&#xff0c;传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求&#xff0c;促使企业寻求突破之道。而 3D 视觉定位技术&#xff0c;为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...

操作系统的基本认识

操作系统的感性认识 操作系统这个词可能或多或少听说过&#xff0c;比如windows, linux, macOS。这些其实都是工程师们经过实践后的具象化产物。而操作系统原理这六个字就是操作系统的抽象化&#xff0c;更准确的说&#xff0c;操作系统原理是很理论化的东西。举一个不是很恰当…...

使用pycharm连接远程服务器

使用pycharm连接远程服务器 1.在你的项目里配置 SSH &#xff0c;放到服务器上去跑 主机为服务器的IP地址&#xff0c;输入用户名和密码 配置项目位置、选择编译器 2.设置本地更改代码保存后即上传到服务器 在本地使用 pycharm 调试代码&#xff0c;pycharm 上面的代码更改…...

【Linux SH脚本】LinuxCheck 应急检查信息脚本

LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本&#xff0c;旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版&#xff0c;能够扫描并生成详细的报告&#xff0c;涵盖用户管理、权限配置…...

apifox创建一个mock接口

1、新建接口 2、选择mock&#xff0c;开启云端mock&#xff1b; 3、新建期望&#xff1b; 4、编辑响应体&#xff1b; 5、快速请求&#xff0c;测试&#xff1b; &#xff08;主要可能是网络问题&#xff0c;也可以自己python mock一个&#xff1b;apifox简单快速&#xf…...

设计一个基础JWT的多开发语言分布式电商系统

在设计一个分布式电商系统时&#xff0c;保证系统的可扩展性、性能以及跨语言的兼容性是至关重要的。随着微服务架构的流行&#xff0c;越来越多的电商系统需要在多个服务间共享信息&#xff0c;并且保证服务的安全性。在这样的场景下&#xff0c;JSON Web Token&#xff08;JW…...

委托(Delegate)与事件(Event)-(上篇)

C#中的委托&#xff08;Delegate&#xff09;是一种类型安全的函数指针&#xff0c;它允许将方法作为参数传递给其他方法&#xff0c;并且可以用来实现回调机制。委托是C#中实现事件处理、异步编程以及面向对象设计模式的重要工具之一。在C#中&#xff0c;委托被定义为引用类型…...

Scala根据身份证前两位数判断地区

方法一 val id "339005200101010928"// 取出id前两位 val province id.substring(0, 2) /*//println(province)if (province "42") {println("湖北")}else if (province "11") {println("北京")}else if (province &qu…...

freeswitch(开启支持视频H264通话)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景介绍: 内部默认是不支持的,视频通话,需要开启模块使用方法: 第一步:进入vars.xml 下面找到global_codec_prefs和outbound_codec_pr…...

启发式搜索算法和优化算法的区别

启发式搜索算法和优化算法在计算机科学中都有广泛的应用&#xff0c;但它们之间存在一些明显的区别。 一、定义与核心思想 启发式搜索算法 定义&#xff1a;启发式搜索算法是一类基于经验和直觉的问题求解方法&#xff0c;通过观察问题的特点&#xff0c;并根据某种指…...

数据结构初阶---二叉树---堆

一、树 1.树的概念 树是一种非线性的数据结构&#xff0c;由n(n≥0)个有限结点组成的一个有层次关系的集合。形状类似一棵倒挂的树&#xff0c;根朝上&#xff0c;分支向下。 根结点没有前驱结点&#xff0c;可以有n(n≥0)个后继结点。 其余结点被分为M个互不相交的集合&am…...

微信小程序中 crypto-js 加解密全攻略

一、引言 在微信小程序开发中&#xff0c;数据的安全至关重要。加解密技术在保护用户数据和应用程序的安全性方面起着关键作用。小程序在与服务器进行数据交互时&#xff0c;面临着数据泄露、篡改等安全风险。为了确保用户信息的安全&#xff0c;选择合适的加解密算法变得尤为…...

单片机的软件开发环境

单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种将计算机系统中的中央处理器&#xff08;CPU&#xff09;、存储器&#xff08;Memory&#xff09;、输入输出接口&#xff08;I/O&#xff09;等集成在一块芯片上的微型计算机。单片机因其体积小、成本低、功能强…...

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom&#xff1a; dataZoom: [{type: inside, // inside 鼠标左右拖图表&#xff0c;滚轮缩放&#xff1b; slider 使用滑动条start: 0, // 左边的滑块位置&#xff0c;表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…...

Python 实现对人的行为预测

引言 随着人工智能技术的快速发展&#xff0c;行为预测在多个领域如智能安防、自动驾驶、个性化推荐系统等中扮演着越来越重要的角色。通过分析历史数据并结合先进的机器学习算法&#xff0c;我们可以预测个体或群体的行为模式&#xff0c;从而做出更加智能和高效的决策。本文…...

使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)

原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写&#xff0c;抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化&#xff0c;从而确保了枚举的单例特性。 …...

scala隐式转换

概念&#xff1a; 在Scala编程语言中&#xff0c;隐式转换是一种强大的功能&#xff0c;它允许程序在需要时自动转换数据类型或增强对象功能。这种转换通常是通过定义一个标记为implicit的函数来实现的&#xff0c;这个函数能够将一种类型转换为另一种类型。隐式转换的使用可以…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...