当前位置: 首页 > 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;这个函数能够将一种类型转换为另一种类型。隐式转换的使用可以…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...