玩转Java8新特性
背景
说到Java8新特性,大家可能都耳濡目染了,代码中经常使用遍历stream流用到不同的api了,但是大家有没有想过自己也自定义个函数式接口呢,目前Java8自带的四个函数式接口,比如Function、Supplier等
stream流中也使用到了,但是这四个函数式接口不仅仅只是为了遍历stream流而产生的,可以在别的地方也可以单独使用这个四个函数式接口,甚至四个不够可以自定义一个都可以
自定义函数式接口
@FunctionalInterface
public interface StatusProcessFunction {/*** 整车大版本策略-有效/无效处理逻辑** @param status 有效:1 无效:0* @return void**/void statusMessageProcess(String status);
}
/*** 如果参数为有效:1 ---> 该目标大版本下所有原版本策略都是有效的,可以继续* 反之无效:0 ----> 该目标大版本下所有原版本策略都是无效的,需要将策略都设置失效状态 2、策略关联的任务都设置为失效状态** @param status 有效:1 无效:0* @return com.adups.iov.open.api.vsp.service.StatusProcessFunction**/private StatusProcessFunction isValid(String status, String versionCode) {return (errorMessage) -> {if (Objects.equals(status, ZERO)) {// 通过目标大版本号且是有效状态的获取所有的关联任务idList<TaskStrategyInfoDO> taskStrategyInfoDOS = bigVersionInfoMapper.queryTaskIdsByVersionCode(versionCode);boolean anyMatchTask = taskStrategyInfoDOS.stream().anyMatch(s -> !ObjectUtils.isEmpty(s.getTaskId()));if (anyMatchTask) {// 批量修改任务的状态置为已失效strategyInfoMapper.updateTaskStatusByVersionCode(taskStrategyInfoDOS);}boolean anyMatchStrategy = taskStrategyInfoDOS.stream().anyMatch(s -> !ObjectUtils.isEmpty(s.getStrategyId()));if (anyMatchStrategy) {// 批量修改策略的状态置为已失效strategyInfoMapper.updateStrategyStatusByVersionCode(taskStrategyInfoDOS);}log.info("整车大版本策略-目标大版本已置为失效状态,目标版本下的策略和任务均置为已失效:status -->{}," +"versionCode-->{},业务异常信息:{}", status, versionCode, errorMessage);}};}
/*** 保存整车大版本策略信息** @param {@link versionStrategyInfoDTO}<{@link VehicleVersionStrategyInfoDTO}> 整车大版本策略信息入参模型* @return BigVersionInfoDO 返回整车大版本策略信息(包含主键id)*/private BigVersionInfoDO saveBigVersionInfo(VehicleVersionStrategyInfoDTO versionStrategyInfoDTO) {// 构建BigVersionInfoDO对象-填充入库属性BigVersionInfoDO bigVersionConvertDO = StrategyInfoConvert.INSTANCE.dtoStrategyBigVersionConvertDO(versionStrategyInfoDTO.getVehicleBigVersion());bigVersionConvertDO.setModelId(vehicleModelMapper.getModelIdByElectricalPlatform(bigVersionConvertDO.getElectricalPlatform()));// 新增整车大版本信息如果重复就更新否则就插入isValid(bigVersionConvertDO.getStatus(), bigVersionConvertDO.getVersionCode()).statusMessageProcess(DataSyncConstant.PO_STRATEGY_RESPONSE_LOG);bigVersionInfoMapper.saveBigVersionInfo(bigVersionConvertDO);return bigVersionConvertDO;}
函数式接口替代策略模式-Supplier
说到策略模式,大家肯定都用到过我之前有篇已经说过策略模式+工厂方法
大家其实都知道有时候设计模式并不是为了简化代码的,更多的是为了扩展性的,但是有时候并不是适用所有场景,当然通过不同类型发生不同的行为,前提这些行为的步骤都是一样的,只是有些行为的内容不一样,这个时候你当然可以使用策略模式+工厂方法,但是也可以使用函数式接口
需求
现在有四个控制层,但是业务层都可以封装一个,只是参数不同而已,当然你也可以都拆开,但是这些肯定idea会提示很多重复代码嘛,对于这种就可以传入一个函数式接口作为形参

@Slf4j
@RestController
public class PackageInfoSyncController {@Autowiredprivate VspAsyncServiceCommonHandle serviceCommonHandle;/*** 软件包信息同步** @param requestDTO po入参* @return POResponseVO*/@PostMapping("/ota/package/info")public POResponseVO packageInfoParse(@RequestBody PORequestDTO requestDTO) {return serviceCommonHandle.asyncServiceCommonHandle(requestDTO, () -> MapUtil.builder().put(DataSyncConstant.TYPE, DataSyncEnum.PACKAGE_INFO.getType()).put(DataSyncConstant.RESPONSE, DataSyncConstant.PO_PACKAGE_RESPONSE_EXISTED_LOG).put(DataSyncConstant.RESULT, DataSyncConstant.PO_PACKAGE_RESPONSE_LOG).build());}
}
/*** VSP平台策略信息同步信息** @param requestDTO 同步数据* @param mapSupplier mapSupplier* @return {@link POResponseVO}*/public POResponseVO asyncServiceCommonHandle(PORequestDTO requestDTO, Supplier<Map<Object, Object>> mapSupplier) {...中间的业务代码都省略String hashCount = strategyInfoMapper.querySyncStrategyInfo(hash, (Integer)mapSupplier.get().get(DataSyncConstant.TYPE));return new POResponseVO();}
函数式接口替代策略模式-Function
在Java 8中,您可以使用java.util.function.Function接口来传递行为(功能)作为参数。下面是一个简单的示例,演示如何将相同的代码抽取出来,并通过Function函数式接口传递不同的行为:
import java.util.function.Function;public class FunctionExample {public static void main(String[] args) {// 示例1:将字符串转换为大写String result1 = processString("Hello, World!", str -> str.toUpperCase());System.out.println("Result 1: " + result1);// 示例2:将字符串转换为小写String result2 = processString("Hello, World!", str -> str.toLowerCase());System.out.println("Result 2: " + result2);// 示例3:将字符串长度加倍Integer result3 = processInteger(5, num -> num * 2);System.out.println("Result 3: " + result3);}// 通用方法,接受一个字符串和一个 Function 接口实例private static String processString(String input, Function<String, String> function) {return function.apply(input);}// 通用方法,接受一个整数和一个 Function 接口实例private static Integer processInteger(Integer input, Function<Integer, Integer> function) {return function.apply(input);}
}
在上述示例中,processString方法和processInteger方法接受一个泛型参数(字符串或整数),以及一个Function接口的实例作为参数。通过传递不同的Function实例,您可以实现对相同代码的不同行为。在示例中,分别演示了将字符串转换为大写、小写以及将整数加倍的三种不同行为。
相关文章:
玩转Java8新特性
背景 说到Java8新特性,大家可能都耳濡目染了,代码中经常使用遍历stream流用到不同的api了,但是大家有没有想过自己也自定义个函数式接口呢,目前Java8自带的四个函数式接口,比如Function、Supplier等 stream流中也使用…...
EasyRecovery2024永久免费版电脑数据恢复软件下载
EasyRecovery数据恢复软件是一款非常好用且功能全面的工具,它能帮助用户恢复各种丢失或误删除的数据。以下是关于EasyRecovery的详细功能介绍以及下载步骤: EasyRecovery-mac最新版本下载:https://wm.makeding.com/iclk/?zoneid50201 EasyRecovery-win…...
QQ音乐新版客户端的音乐无法解密?来看看解决方法!音乐解锁工具Web+批处理版本合集,附常见问题及解决方法!
一、软件简介 一般会员制音乐软件(如某抑云,某鹅,某狗音乐)的歌曲下载后都是加密格式,加密格式的音乐只能在特定的播放器中才能播放,在其他音乐播放器和设备中则无法识别和播放。音乐解锁工具的作用就是将…...
2023年12月CCF-GESP编程能力等级认证C++编程一级真题解析
一、单选题(共15题,共30分) 第1题 以下C++不可以作为变量的名称的是( )。 A:CCF GESP B:ccfGESP C:CCFgesp D:CCF_GESP 答案:A 第2题 C++表达式 10 - 3 * (2 + 1) % 10 的值是( )。 A:0 B:1 C:2 D:3 答案:B 第3题 假设现在是上午十点,求出N小时(正整数…...
如何决定K8S Pod的剔除优先级
在Kubernetes(k8s)中,当节点资源面临压力时,如何决定Pod的优先级是一个关键问题。在Kubernetes 1.8版本之后,引入了基于Pod优先级的调度策略,即Pod Priority Preemption。这种策略允许在资源不足的情况下&a…...
【JavaScript】数据类型
文章目录 1. 数字(Number)2. 字符串(String)3. 布尔(Boolean)4. 对象(Object)5. 数组(Array)6. Undefined 和 Null7. typeof 操作符总结 在 JavaScript 中&am…...
JAVA:单例模式提高性能和安全性的优化技巧
1、简述 单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在 Java 中,单例模式的优化不仅可以提高性能,还可以增强安全性和可维护性。本文将介绍一些关键的技巧和最佳实践,帮助你优化单例…...
如何在 Ubuntu 上安装 ONLYOFFICE 文档 8.0
通过使用社区版,您有能力在您自己的服务器上部署 ONLYOFFICE 文档,从而使在线编辑器与 ONLYOFFICE 协作平台或其他热门系统进行无缝集成。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一款全面的在线办公工具,提供了文本文档…...
什么是大模型
目录 让你了解什么是大模型什么是大模型?大模型的应用场景常见的大模型技术实例分析:深度学习语言模型GPT-3 让你了解什么是大模型 大模型(Big Model)是指在机器学习和人工智能领域中处理大规模数据和复杂模型的一种方法或技术。…...
C#在既有数组中插入另一个数组:Array.Copy方法 vs 自定义插入方法
目录 一、使用的方法 1.使用Array.Copy方法 2.Copy(Array, Int32, Array, Int32, Int32) 3. 使用自定义的方法 二、实例 1.示例1:使用Array.Copy方法 2.示例2:使用自定义的方法 一、使用的方法 1.使用Array.Copy方法 首先定义了一个名为InsertAr…...
上位机图像处理和嵌入式模块部署(linux开发板的选择)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多图像算法是通过上位机来完成的,比如说工业视觉当中的halcon,一般都是要运行在windows平台上面,并且需要高性…...
2024情人节送女朋友什么礼物?精准送礼看这个就对啦!男生必看!
爱情是生活中最美好的情感之一,而情人节则是表达这份感情的最佳时刻。在2024年的情人节来临之际,作为男生的你是否已经为心爱的她准备了一份特别的礼物呢?如果你还在犹豫不决,那么这篇文章就是为你准备的!我们将会从女…...
查询每张表占用磁盘空间大小(达梦数据库)
查询每张表占用磁盘空间大小 环境介绍 环境介绍 在迁移准备工作中,为了更好评估迁移时间,可以统计大表数量与大表的实际大小,为迁移规划做准备 --查看用户下面每张表占用的磁盘空间SELECT T.OWNER,T.SEGMENT_NAME,T.SEGMENT_TYPE,T.TABLESPACE_NAME,T.BYTES,T.BYTES/1024 BYT…...
Vue3——创建一个应用
文章目录 创建应用实例挂载应用没有模板的组件的挂载 应用配置多个应用实例 其实使用脚手架创建的vue项目的main.js文件中已经为我们配置好 vue应用的创建。 import { createApp } from vue import App from ./App.vue const app createApp(App) app.mount(#app)创建应用实例…...
深度学习系列56:使用whisper进行语音转文字
1. openai-whisper 这应该是最快的使用方式了。安装pip install -U openai-whisper,接着安装ffmpeg,随后就可以使用了。模型清单如下: 第一种方式,使用命令行: whisper japanese.wav --language Japanese --model…...
【Web - 框架 - Vue】随笔 - 通过`CDN`的方式使用`VUE 2.0`和`Element UI`
通过CDN的方式使用VUE 2.0和Element UI VUE 网址 https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js源码 https://download.csdn.net/download/HIGK_365/88815507测试 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…...
设计模式(行为型模式)备忘录模式
目录 一、简介二、备忘录模式2.1、备忘录2.2、原发器2.3、备忘录模式 三、优点与缺点 一、简介 备忘录模式(Memento Pattern)是一种行为设计模式,旨在捕获一个对象的内部状态,并在不破坏对象封装的前提下将其保存,以便…...
opencv案例实战:条码区域分割
前言 识别二维码是一个日常生活中常见的应用,而识别之前,需要先分割出条形码的区域来获取条形码。我们可以使用OpenCV便捷的获取条码的区域。 逐步分析 为了了解数据处理的过程,我们逐步分析并显示处理过程 查看图像 在读入时,传入参数cv2.IMREAD_GRAYSCALE可以直接按…...
《MySQL》超详细笔记
目录 基本知识 主流数据库 数据库基本概念 MySQL启动 数据库基本命令 数据库 启动数据库 显示数据库 创建数据库 删除数据库 使用数据库 查询当前数据库信息 显示数据库中的表 导入数据库脚本 表 查看表的结构 查看创建某个表的SQL语句 数据库的查询命令 查询…...
商用密码
商用密码(Commercial Cryptography)涉及到多个方面,包括但不限于数据加密、数字签名、身份验证和安全通信等。商用密码的目的是保护信息的机密性、完整性和可用性,确保数据在存储和传输过程中的安全。以下是一些Java商用密码方向的…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
