嵌套访问_利用Idea重构功能及Java8语法特性——优化深层嵌套代码
当遇到深层嵌套代码,如for,if,lambda表达式或内部类及这些代码的组合,这时我们可以通过Java 8的语法特性来进行优化。
下面的代码是一个嵌套循环的示例。
public MappedField getMappedField(final String storedName) { for (final MappedField mf : persistenceFields) { for (final String n : mf.getLoadNames()) { if (storedName.equals(n)) { return mf; } } } return null;}
重构1:
嵌套的for/if语句通畅可以通过Java 8中的stream来替代。
Optional found = persistenceFields.stream().flatMap(mappedField -> mappedField.getLoadNames().stream()).filter(storedName::equals).findFirst();
上述重构代码会返回Optional,但笔者希望返回mappedField对象,再次改造后的代码如下。
persistenceFields.stream().filter(mappedField -> { for (String name : mappedField.getLoadNames()) { if (storedName.equals(name)) { return true; } } return false;}).findFirst()
重构2: 进行更好的封装
重构1还存在一些问题,我们需要了解mappedField的结构,并通过循环遍历其所有name来找到匹配的name。根据迪米特法则(Law of Demeter ),及命令-不要去询问法则(Tell, Don’t Ask), 下面代码应该由MappedField对象来提供对应的方法来判断,而不是由调用者去了解MappedField结构后去写逻辑进行判断。
for (final MappedField mf : persistenceFields) { if (mf.hasName(storedName)) { return mf; }}
因此将上述代码提取为MappedField类中独立的方法,并命名为hasName。如果使用的IDE 是IDEA则可以通过refractor中的extract功能完成提取。
最后调用hasName方法来替代循环判断逻辑。
接着通过Idea的refractor 中的move功能将代码移动到目标类位置。
接着通过stream来重构hasName方法,hasName方法变更为下面的形式。
public Boolean hasName(String storedName) { return getLoadNames().stream() .anyMatch(storedName::equals);}
经过上述步骤最终重构后的代码为。
public MappedField getMappedField(final String storedName) { return persistenceFields.stream() .filter(mf -> mf.hasName(storedName)) .findFirst() .orElse(null);}
如需要返回Optional包装的对象则需要去掉orElse。
public Optional getMappedField(final String storedName) { return persistenceFields.stream() .filter(mf -> mf.hasName(storedName)) .findFirst();}
总结
这类代码特征通常为:
- 存在深层的循环或条件判断嵌套。
- 需要通过多个getter方法来访问对象内部数据。
重构方法:
考虑tell don’t ask原则,提供专用的方法供外部调用访问数据,而不是通过使用者经过多次访问去获取对象数据。并通过stream提供的操作来完成重构。
Java架构师丨苏先生:专注于Java开发技术的研究与知识分享!
————END————
- 点赞(感谢)
- ...
- 转发(感谢)
- ...
- 关注(感谢)
- ...
嵌套访问_利用Idea重构功能及Java8语法特性——优化深层嵌套代码相关推荐
- python实现按键精灵的功能_利用Python实现Windows下的鼠标键盘模拟的实例代码
本文介绍了利用Python实现Windows下的鼠标键盘模拟的实例代码,分享给大家 本来用按键精灵是可以实现我的需求,而且更简单,但既然学python ,就看一下呗. 依赖: pip install ...
- 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...
利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...
- java不同项目加token访问_利用JWT实现前后端分离的Token验证
写在前面:本篇文章的代码图片展示均使用carbon绘制,图片质量很高,如果图片过小可以点击查看原图.项目实例前端部分使用基于Angular的Ionic框架(TypeScript),使用Spring B ...
- html5经纬度定位 源码_利用HTML5定位功能获取经纬度,在根据经纬度利用百度地图获取位置信息...
一.引入相关js 二.js代码 // 单次位置请求执行的函数 function getLocation(){ navigator.geolocation.getCurrentPosition(mapI ...
- c++椭圆最小二乘法原理_利用最小二乘法拟合椭圆方程的理论推导,附有matlab代码...
为了很好的进行椭圆方程拟合,本文先对椭圆基本知识进行复习,后进行非标准椭圆方程拟合公式推导,最后有matlab代码的实现. 1. 用最小二乘法做椭圆拟合 1.1. 椭圆标准方程 对椭圆印象最深的就是高 ...
- python 找出列表中出现最多的元素_利用Python找出序列中出现最多的元素示例代码...
前言 Python包含6种内置的序列:列表.元组.字符串 .Unicode字符串.buffer对象.xrange对象.在序列中的每个元素都有自己的编号.列表与元组的区别在于,列表是可以修改,而组元不可 ...
- html地图定位系统原理代码,利用HTML5定位功能实现在百度地图上定位
利用HTML5定位功能,实现在百度地图上定位 代码如下: HTML5定位 *{ margin: 0px; padding: 0px;} body{text-align: center; height ...
- c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能
原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...
- 图片 标记 软件_如何设计软件功能标记
图片 标记 软件 A previous company had a problem: our deploys were thousands of lines in size, took nearly ...
最新文章
- 我是如何把VC6一直用到2016年的
- communication for making more gains or simply a leisure?
- 苹果或于2020年开售iPhone SE2
- xtragrid 某个值 查找_Java 经典算法:二分法查找(循环和递归两种方式实现)
- 帆软报表判断传入条件是否为空,根据逗号分隔
- 25个超适合学生党的0成本兼职,自我增值的最有效方式
- Java之 OOP编程思想理解1
- 3.14 使用画笔工具给头发着色 [Ps教程]
- NCBI数据库以及常用编号
- clean-label backdoor attacks 论文笔记
- MFS分布式文件系统
- llg的农场(farm)
- 解析程序包出现问题(更新下载apk)
- 如何减小电压跟随器输出电阻_逐次比较式模数转换器如何获取最佳采样频率
- Java剑开天门(二)
- 【quasi-maximum likelihood decoder】一种有效的PSK信号准最大似然译码器matlab性能仿真
- [附源码]java+ssm计算机毕业设计个人所得税服务系统0dol2(源码+程序+数据库+部署)
- 测绘大地测量乙级资质新申请条件及办理流程
- Windows下Python新手安装教程
- (转)Linux 一句话精彩问答
热门文章
- 【报告分享】2022年中国商业十大热点展望.pdf(附下载链接)
- 【白皮书分享】2021年B2B内容营销白皮书.pdf(附下载链接)
- 专访头条搜索:从推荐到搜索,如何构建搜索技术的另一种可能?
- leetcode力扣17.电话号码的字母组合
- io hang linux 原理,Linux 避免IO hang
- 网络相关的常用协议总结
- 关于联合体输出的问题(是否小端模式)
- 【PHP 开发】mac 在 PHP 环境安装 mcrypt 扩展的方法
- C语言mutex使用案例,C语言 如何使用互斥锁严格交替使用两个线程?
- android系统 wifi,Android系统wifi分析-手动连接过程