Java8新特性——函数式接口
目录
一、介绍
二、示例
(一)Consumer
源码解析
测试示例
(二)Comparator
(三)Predicate
三、应用
四、总结
一、介绍
@FunctionalInterface是一种信息注解类型,用于指明接口类型声明成为Java语言规范定义的函数式接口。从概念上说,函数式接口只有一个抽象方法,因为默认方法有一个实现,所以他们不是抽象的。如果一个接口声明了一个抽象方法覆盖java.lang的一个公共方法,这也不计入接口的抽象方法计数,因为接口的任何实现都将有来自java.lang.Object或其他地方的实现。函数式接口的实例可以使用lambda表达式、方法引用或构造函数引用来创建。
二、示例
(一)Consumer<T>
(消费者)表示一个接受单个输入参数并且不返回结果的操作。
源码解析
accept()方法接收一个参数,并对该参数执行特定的操作,没有返回值
addThen()方法接受一个consumer类型的对象,它将一个consumer对象与另一个consumer对象进行关联,该方法会返回一个新的consumer对象,它首先执行当前consumer的accept()方法,然后再执行传入的after consumer对象的accpet()方法。
@FunctionalInterface
public interface Consumer<T> {/*** Performs this operation on the given argument.** @param t the input argument*/void accept(T t);/*** Returns a composed {@code Consumer} that performs, in sequence, this* operation followed by the {@code after} operation. If performing either* operation throws an exception, it is relayed to the caller of the* composed operation. If performing this operation throws an exception,* the {@code after} operation will not be performed.** @param after the operation to perform after this operation* @return a composed {@code Consumer} that performs in sequence this* operation followed by the {@code after} operation* @throws NullPointerException if {@code after} is null*/default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}
测试示例
public class ConsumerTest {public static void main(String[] args) {Consumer<String> printUpperCase = s -> System.out.println(s.toUpperCase());Consumer<String> printLength = s -> System.out.println(s.length());Consumer<String> combine = printUpperCase.andThen(printLength);List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Jim");names.forEach(printUpperCase);names.forEach(combine);}
}
(二)Comparator<T>
(比较器)compare方法是Comparator接口中的方法,它用于比较两个对象的大小。一般来说,如果第一个对象小于第二个对象,则返回负整数;如果第一个对象等于第二个对象,则返回零;如果第一个对象大于第二个对象,则返回正整数。
public class ComparatorTest {public static void main(String[] args) {// 自定义比较器,实现compare方法,比较规则是自然数降序排列CustomedComparator customedComparator = new CustomedComparator();List<Integer> list = Arrays.asList(5, 8, -2, 0, 10);list.sort(customedComparator);// forEach函数传入一个consumer对象,底层是加强for循环 + 调用accpet()list.forEach(ele -> System.out.println(ele));}
}
Comparator接口声明了函数式接口,但接口中声明了两个抽象方法,这显然不符合之前给的定义。首先我先验证是否注解允许多个抽象方法,验证得出声明此注解的接口只能有一个抽象方法。Comparator接口中声明了equals和compare两个抽象方法, 其中equals是Object类的公共方法,这里令我不解的是接口中equals方法是声明的抽象方法,但它却无需实现,这里需要注意一下。最后,声明函数式接口只有一个抽象方法这是肯定的。
(三)Predicate<T>
(断言)predicate<T>代表了一个接受一个参数并返回布尔值结果的判断条件。该接口中只有一个抽象方法test,用于对给定的参数进行判断,并返回一个布尔值。
public class PredicateTest {public static void main(String[] args) {Predicate<Integer> predicate = num -> num % 2 == 0;System.out.println(predicate.test(11));System.out.println(predicate.test(0));}
}
三、应用
- forEach方法,迭代器方法,参数是consumer对象。
- Arrays.sort()方法,传入comparator对象,自定义比较
- Stream流操作
- lambda表达式
四、总结
函数式接口是JDK8的新特性,在函数式接口使用ambda表达式会使代码更加简洁,上述内容如果有错误的地方,希望大佬们可以指正。我一直在学习的路上,您的帮助使我收获更大!觉得对您有帮助的话,还请点赞支持!我也会不断更新文章!
相关文章:
Java8新特性——函数式接口
目录 一、介绍 二、示例 (一)Consumer 源码解析 测试示例 (二)Comparator (三)Predicate 三、应用 四、总结 一、介绍 FunctionalInterface是一种信息注解类型,用于指明接口类型声明…...
Epson打印机连接wifi
环境 Epson L3153 打印机联通无线光猫 背景 最近家里的联通宽带不太稳定,经常断网。今天打了联通客服电话,师傅上门来,说可能是光猫用的时间太长了,换了一个新的联通光猫,问题解决。 wifi的名称是 CU_Y3ft 和 CU_Y3…...
Chapter 7 - 6. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理
Dedicated and Converged Ethernet Network专用和融合以太网网络 Just because a network is configured as a converged Ethernet network (lossy and lossless traffic), doesn’t necessarily mean that lossy and lossless traffic runs on it simultaneously. For exampl…...
【论文笔记】NeuRAD: Neural Rendering for Autonomous Driving
原文链接:https://arxiv.org/abs/2311.15260 1. 引言 神经辐射场(NeRF)应用在自动驾驶中,可以创建可编辑的场景数字克隆(可自由编辑视角和场景物体),以进行仿真。但目前的方法或者需要大量的训…...
通信原理 | 分贝dB、功率、功率谱、功率谱密度、信噪比
文章目录 分贝功率和分贝的关系能量谱功率谱功率谱和功率谱密度是不同的功率谱密度随机信号和确知信号信噪比基本定义分贝表示应用分贝 分贝:(用dB表示)是量度两个相同单位之间数量比例的计量单位,主要用于度量声音强度。 1贝尔(B)=10分布(dB),即1B = 10dB 分贝是以美国…...
Go中的Context是什么?
在 Go 编程语言(通常称为 Golang)中,术语 "上下文 "指的是上下文包及其定义的上下文类型。上下文包用于跨 API 边界和进程间传输截止日期、取消信号和其他请求范围值。 上下文包的主要目的是管理并发或分布式系统中操作的生命周期…...
碳排放预测 | 基于ARIMA和GM(1,1)的碳排放预测(Matlab)
目录 预测效果基本介绍模型描述ARIMA模型GM(1,1)模型 程序设计参考资料 预测效果 基本介绍 基于ARIMA和GM(1,1)的碳排放预测(Matlab) 基于ARIMA(自回归移动平均模型)和GM(1,1)(灰色预测模型)的碳排放预测是…...
FPFA.一种二倍频电路代码描述以及测量详情
一、前言 1、因为需要倍频电路所以找了个二倍频的电路,通过fpga实际测量发现经过倍频后的电路峰值降低。不过这个也正常,因为该电路只要过触发点就会开始发生波形变化,而电路的触发值不是峰值。 2、继续对电路做倍频后信号做二…...
dotnet命令创建C#项目,VSCode打开
在命令行中创建项目并运行 1.首先安装.net 下载地址:.NET | 构建。测试。部署。 2.在 cmd 控制台输入 dotnet --vesion 检查版本号是否正常 3.我用git bash环境输入命令创建项目 // 创建文件夹 mkdir MyVSCode // 进入该文件夹 cd MyVSCode/ // 创建控制台项目 dotnet …...
在GitHub找开源项目
在 GitHub 的搜索框里: 使用搜索关键词可以在 GitHub 上快速的找你需要的开源项目: 限制搜索范围 通过 in 关键词 (大小写不敏感) 限制搜索范围: 公式搜索范围in:name xxx项目名包含xxxin:description xxx项目描述包含xxxin:readme xxx项目…...
GAMES101-LAB1
文章目录 一、问题简述二、框架准备三、作业参考3.1 模型矩阵3.1 参考代码 3.2 投影矩阵3.2.1 压扁操作(透视投影)3.2.2 正交投影3.2.3 参考代码 四、附件 一、问题简述 接下来的三次作业,将模拟一个基于CPU的光栅化渲染器的简化版本本次作业的任务是实现一个旋转矩…...
Docker 编译OpenHarmony 4.0 release
一、背景介绍 1.1、环境配置 编译环境:Ubuntu 20.04OpenHarmony版本:4.0 release平台设备:RK3568 OpenHarmony 3.2更新至OpenHarmony 4.0后,公司服务器无法编译通过,总是在最后几十个文件时报错,错误码4000…...
Vue 3 表单处理精讲:打造响应式注册表单的艺术
🧙♂️ 诸位好,吾乃诸葛妙计,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &…...
浅谈Guava Cache的参数使用
CacheLoader 用于数据加载方式比较固定且统一的场景,在缓存容器创建的时候就需要指定此具体的加载逻辑。通常开发中使用时我们需要继承CacheLoader类或写一个匿名实现类实现其load方法和reload方法 load方法 当执行get操作没有命中缓存或者判断缓存已经超出expir…...
交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM)
目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM) 程序设计 完整程序和数据获取方式:私信博主回复Matlab基于KNN-BiLSTM的交通流预测(对…...
云卷云舒:面向业务的智能运维(上)
1、BAIOPS-业务智能运维 智能运维(AIOps-Algorithmic IT Operations基于算法的IT运维)是人工智能技术在IT运维领域的运用,引用Gartner 的报告的一段话“到2020年,将近50%的企业将会在他们的业务和IT运维方面采用AIOps,…...
centos 7.4 docker
centos 7.4 docker 1.查看系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)哈1 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 哈1-02 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 哈1-22 cat /etc/redhat…...
零基础学人工智能:TensorFlow 入门例子
识别手写图片 因为这个例子是 TensorFlow 官方的例子,不会说的太详细,会加入了一点个人的理解,因为TensorFlow提供了各种工具和库,帮助开发人员构建和训练基于神经网络的模型。TensorFlow 中最重要的概念是张量(Tenso…...
go从0到1项目实战体系二一:gin框架安装
(1). 设置公用的代理服务地址: 如果设置了全局可忽略. $ export GOPROXYhttps://goproxy.io // linux > go env可以查看 $ export GOPROXYhttps://goproxy.cn // linux国内镜像 $ set GOPROXYhttps://goproxy.io // windows(2). 创建以下目录: 请忘记GOPATH目录…...
运用JavaSE知识实现图书管理系统
目录 一.Main函数二.用户类三.普通用户类四.管理员类五.图书类六.书架类七.操作类1.操作接口2.增加操作3.删除操作4.查找操作5.展示操作6.借阅操作7.归还操作8.退出系统 总结 这篇图书管理系统是对JavaSE知识总结复习的一个小作业,检测自己对知识的掌握程度。 一.Ma…...
OpenClaw怎么换大模型?3步免费切换各种大模型配置教程
手把手教你一键部署OpenClaw,连接微信、QQ、飞书、钉钉等,1分钟全搞定! 简单说一下:OpenClaw这玩意儿本身没带“大脑”,它就是个负责干活的躯壳,得靠接外面的大模型才能思考。想换个“大脑”其实就三步&am…...
别再手动配置了!用Docker Compose一键部署你的第一个Web应用(附完整YAML文件)
别再手动配置了!用Docker Compose一键部署你的第一个Web应用(附完整YAML文件) 想象一下这样的场景:你刚完成了一个简单的Web应用开发,准备部署到服务器上。传统方式可能需要手动安装Nginx、配置反向代理、设置环境变量…...
老旧Mac硬件解锁:用OpenCore Legacy Patcher实现Monterey系统焕新指南
老旧Mac硬件解锁:用OpenCore Legacy Patcher实现Monterey系统焕新指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着macOS版本迭代,许多经典…...
GitLab实战:如何用rebase -i优雅合并多个commit(附常见错误排查)
Git提交历史优化:交互式rebase高阶操作指南 1. 为什么需要整理Git提交历史 在团队协作开发中,我们经常会遇到提交历史杂乱无章的情况。想象一下这样的场景:你完成了一个新功能的开发,但在这个过程中产生了十几个零散的提交记录&am…...
MoE大模型入门指南:小白也能掌握的AI核心技术(收藏学习)
混合专家模型(Mixture-of-Experts, MoE)是机器学习和深度学习中的一种流行架构,目前被广泛应用于大模型领域。MoE的基本原理是通过门控(Gating)机制,加权集成各专家(Experts…...
论文AI率从80%降到10%以下的完整攻略:实测3款降AI率工具真实效果
论文AI率从80%降到10%以下的完整攻略:实测3款降AI率工具真实效果 上个月我同学发来一张知网检测报告,AI率87%,整个人都懵了。她用DeepSeek写了大部分初稿,没想到检测会这么高。当时距离论文提交截止不到两周,她问我有没…...
YOLO12与Qt结合:跨平台目标检测应用开发
YOLO12与Qt结合:跨平台目标检测应用开发 1. 引言 想象一下,你开发了一个优秀的目标检测模型,能够在各种场景下准确识别物体。但当你想要把它部署到不同设备上时,却遇到了麻烦:Windows、macOS、Linux各有各的兼容性问…...
告别GPU依赖?LocalAI让普通设备玩转本地化AI部署的完整方案
告别GPU依赖?LocalAI让普通设备玩转本地化AI部署的完整方案 【免费下载链接】LocalAI mudler/LocalAI: LocalAI 是一个开源项目,旨在本地运行机器学习模型,减少对云服务的依赖,提高隐私保护。 项目地址: https://gitcode.com/Gi…...
嘎嘎降AI退款申请完整流程:不达标怎么拿回费用的具体步骤
嘎嘎降AI退款申请完整流程:不达标怎么拿回费用的具体步骤 这篇教程来自实操经验。帮三个同学处理过论文AI率,加上自己的,前后操作了十几次。把流程总结成教程,尽量详细。 核心工具推荐嘎嘎降AI(www.aigcleaner.com&a…...
IIS网站部署实战:从基础配置到安全优化
1. IIS网站部署基础配置 第一次在Windows Server上部署IIS网站时,我踩了不少坑。记得当时为了调试一个简单的ASP网站,折腾了整整一个下午。现在回想起来,其实只要掌握几个关键步骤,就能轻松完成基础部署。 首先需要在服务器管理器…...
