函数式编程的妙用

前言

我们平常项目中维护的比较多的就是实体类中的数量问题,我们最常见的做法就是通过get方法读取旧数据,然后进行新数据的set 。这套方法相对来说是比较统一固定的,如果有多处地方使用,我们可以想着通过FunctionBiConsumer的函数式接口进行规范统一。

函数的简单介绍

我们的业务需求其实就是 get 获取属性值 [传入一个实体,获取属性],然后通过set 设置该属性的数值 [传入一个实体,需要设置的数值]

get 属性的业务需求其实和Function函数表达的是一个含义
在这里插入图片描述

set 对象属性可以看成是BiConsumer类似,用来设置一个对象的数据值
在这里插入图片描述

项目使用

  1. 我们可以定义一个基类,他的属性分别是Function 类型的get 和 BiConsumer类型的 set。后续要操作数值类型的Get 和 Set 都可以使用该基类定义

@Data
@AllArgsConstructor
public class GetAndSet<T, N> {private Function<T, N> get;private BiConsumer<T, N> set;public static <T,N> GetAndSet<T,N> build(Function<T, N> get, BiConsumer<T, N> set) {return new GetAndSet<>(get, set);}
}
  1. 定义一个枚举类,该枚举包含了实体属性的一些 get 和 set 操作,复用了基类的两个函数式的方法,这样业务层就可以抽离出来这些关于属性值的设置问题

这里的 LIKE_NUM 维护的是帖子评论的点赞数据,REPLY_NUM 维护的是回复数据,当我们需要进行数值变更的时候,直接调用 doGetAndSet() 方法就能方便的进行数据维护,而无需编写冗余的代码

public class ArticleCommentExtendEnum {/*** 帖子评论拓展信息枚举*/@Getter@AllArgsConstructorpublic enum NumTypeEnum {/*** 点赞数量*/LIKE_NUM("LIKE_NUM", GetAndSet.build(ArticleCommentExtend::getLikeNum, ArticleCommentExtend::setLikeNum)),/*** 回复数量*/REPLY_NUM("REPLY_NUM", GetAndSet.build(ArticleCommentExtend::getReplyNum, ArticleCommentExtend::setReplyNum)),;private final String type;private final GetAndSet<ArticleCommentExtend, Long> getAndSet;public void doGetAndSet(ArticleCommentExtend articleExtend, Long num) {Function<ArticleCommentExtend, Long> get = getAndSet.getGet();BiConsumer<ArticleCommentExtend, Long> set = getAndSet.getSet();Long number = get.apply(articleExtend);set.accept(articleExtend, number + num);}public static ArticleCommentExtendEnum.NumTypeEnum getByType(String type) {if (StrUtil.isEmpty(type)) {return null;}for (NumTypeEnum value : NumTypeEnum.values()) {if (StrUtil.equals(value.getType(), type)) {return value;}}return null;}}
}
  1. 基本使用
    这里外部调用时只要根据是评论数的还是点赞数的维护传入不同的枚举,并传入更新的数量值,就能很好地复用这段代码。而且后续如果新增了其他的分享数,转发数等,也只需要加上对应枚举值,并通过不同的类型进行维护即可。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307560.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java设计模式学习之【模板方法模式】

文章目录 引言模板方法模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用游戏设计示例代码地址 引言 设想你正在准备一顿晚餐&#xff0c;无论你想做意大利面、披萨还是沙拉&#xff0c;制作过程中都有一些共同的步骤&#xff1a;准备原料、加工食物、摆盘。…

毅速:3D打印技术传统模具行业影响深远

随着3D打印技术的不断发展和完善&#xff0c;一系列的优势使其在模具制造领域的应用越来越广泛&#xff0c;这一技术在模具行业的应用将为整个行业带来变革。 首先&#xff0c;3D打印技术将大幅提高模具制造的精度和效率。传统的模具制造过程中&#xff0c;由于加工设备的限制和…

Typora使用PicGo+Gitee上传图片报错403 Forbidden

Typora使用PicGoGitee上传图片报错403 Forbidden Typora使用PicGoGitee上传图片&#xff0c;上传失败了&#xff0c;错误信息如下 打开PicGo的日志文件查看&#xff0c;可以看到错误详情如下 换了一个插件github-plus重新配置&#xff0c;解决了这个问题 再打开日志查看&…

gem5学习(7):内存系统中创建 SimObjects--Creating SimObjects in the memory system

目录 一、gem5 master and slave ports 二、Packets 三、Port interface 1、主设备发送请求时从设备忙 2、从设备发送响应时主设备忙 四、Simple memory object example 1、Declare the SimObject 2、Define the SimpleMemobj class 3、Define the SimpleMemobj class…

python 异步Web框架sanic

我们继续学习Python异步编程&#xff0c;这里将介绍异步Web框架sanic&#xff0c;为什么不是tornado&#xff1f;从框架的易用性来说&#xff0c;Flask要远远比tornado简单&#xff0c;可惜flask不支持异步&#xff0c;而sanic就是类似Flask语法的异步框架。 github&#xff1…

1200PLC连接分布式IO组态编程应用

SMART PLC作为S7-1200PLC的智能IO从站设备组态和编程应用详细介绍请参考下面链接文章&#xff1a; https://rxxw-control.blog.csdn.net/article/details/130257474https://rxxw-control.blog.csdn.net/article/details/130257474这篇博客我们介绍S7-1200PLC和分布式IO连接组…

【LangChain】与文档聊天:将OpenAI与LangChain集成的终极指南

欢迎来到人工智能的迷人世界&#xff0c;在那里&#xff0c;人与机器之间的通信越来越模糊。在这篇博客文章中&#xff0c;我们将探索人工智能驱动交互的一个令人兴奋的新前沿&#xff1a;与您的文本文档聊天&#xff01;借助OpenAI模型和创新的LangChain框架的强大组合&#x…

决心解开软光栅的心结

最近几天离职在家,是的,还没回老家.白天周中的时候写这个软光栅化渲染器.包括在上班的最后项目大家都不干活的时候我已经开始写了.到今天上午总算是有的看了.细节还差很多,下午把透视校正插值加上,下午加不完就元旦假期之后再说(元旦我要写pbrt的读书笔记).还有摄像机裁剪,背面…

红黑树的删除

导航链接 红黑树的性质     红黑树的旋转、变色     红黑树的插入     红黑树的删除 文章目录 导航链接二叉搜索树如何删除结点&#xff1f;场景一&#xff1a;删除没有孩子的结点场景二&#xff1a;删除有一个孩子的结点场景三&#xff1a;删除有两个孩子的结点 红…

jmeter之beanshell使用:常用变量汇总

1.变量--日期 使用场景&#xff1a;当入参日期是变量&#xff0c;取当前日期 使用如下&#xff1a; &#xff08;1&#xff09;当前日期 import java.text.SimpleDateFormat; import java.util.Date;// 创建 SimpleDateFormat 对象并指定日期格式 SimpleDateFormat dateFor…

Linux的账号和权限管理

目录 一、用户账号 1、Linux有三大用户类型&#xff1a; 二、组账号 1、基本组&#xff08;私有组&#xff09;&#xff1a;有且只有一个&#xff0c;一般为创建用户时指定的组。 2、附加组&#xff08;公共组&#xff09;&#xff1a;可有可无&#xff0c;用户除了基本组…

WPF中的线程安全:深入理解Dispatcher和UI更新

在 WPF 中&#xff0c; DispatcherObject 只能由 Dispatcher 它与之关联的访问。 例如&#xff0c;后台线程无法更新与 Dispatcher UI 线程上关联的内容Button。 为了使后台线程访问该 Content 属性 Button&#xff0c;后台线程必须将工作委托给 Dispatcher 与 UI 线程关联的工…