当遇到深层嵌套代码,如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语法特性——优化深层嵌套代码相关推荐

  1. python实现按键精灵的功能_利用Python实现Windows下的鼠标键盘模拟的实例代码

    本文介绍了利用Python实现Windows下的鼠标键盘模拟的实例代码,分享给大家 本来用按键精灵是可以实现我的需求,而且更简单,但既然学python ,就看一下呗. 依赖: pip install ...

  2. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

  3. java不同项目加token访问_利用JWT实现前后端分离的Token验证

    写在前面:本篇文章的代码图片展示均使用carbon绘制,图片质量很高,如果图片过小可以点击查看原图.项目实例前端部分使用基于Angular的Ionic框架(TypeScript),使用Spring B ...

  4. html5经纬度定位 源码_利用HTML5定位功能获取经纬度,在根据经纬度利用百度地图获取位置信息...

    一.引入相关js 二.js代码 // 单次位置请求执行的函数 function getLocation(){ navigator.geolocation.getCurrentPosition(mapI ...

  5. c++椭圆最小二乘法原理_利用最小二乘法拟合椭圆方程的理论推导,附有matlab代码...

    为了很好的进行椭圆方程拟合,本文先对椭圆基本知识进行复习,后进行非标准椭圆方程拟合公式推导,最后有matlab代码的实现. 1. 用最小二乘法做椭圆拟合 1.1. 椭圆标准方程 对椭圆印象最深的就是高 ...

  6. python 找出列表中出现最多的元素_利用Python找出序列中出现最多的元素示例代码...

    前言 Python包含6种内置的序列:列表.元组.字符串 .Unicode字符串.buffer对象.xrange对象.在序列中的每个元素都有自己的编号.列表与元组的区别在于,列表是可以修改,而组元不可 ...

  7. html地图定位系统原理代码,利用HTML5定位功能实现在百度地图上定位

    利用HTML5定位功能,实现在百度地图上定位 代码如下: HTML5定位 *{ margin: 0px; padding: 0px;} body{text-align: center;  height ...

  8. c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能

    原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...

  9. 图片 标记 软件_如何设计软件功能标记

    图片 标记 软件 A previous company had a problem: our deploys were thousands of lines in size, took nearly ...

最新文章

  1. 我是如何把VC6一直用到2016年的
  2. communication for making more gains or simply a leisure?
  3. 苹果或于2020年开售iPhone SE2
  4. xtragrid 某个值 查找_Java 经典算法:二分法查找(循环和递归两种方式实现)
  5. 帆软报表判断传入条件是否为空,根据逗号分隔
  6. 25个超适合学生党的0成本兼职,自我增值的最有效方式
  7. Java之 OOP编程思想理解1
  8. 3.14 使用画笔工具给头发着色 [Ps教程]
  9. NCBI数据库以及常用编号
  10. clean-label backdoor attacks 论文笔记
  11. MFS分布式文件系统
  12. llg的农场(farm)
  13. 解析程序包出现问题(更新下载apk)
  14. 如何减小电压跟随器输出电阻_逐次比较式模数转换器如何获取最佳采样频率
  15. Java剑开天门(二)
  16. 【quasi-maximum likelihood decoder】一种有效的PSK信号准最大似然译码器matlab性能仿真
  17. [附源码]java+ssm计算机毕业设计个人所得税服务系统0dol2(源码+程序+数据库+部署)
  18. 测绘大地测量乙级资质新申请条件及办理流程
  19. Windows下Python新手安装教程
  20. (转)Linux 一句话精彩问答

热门文章

  1. 【报告分享】2022年中国商业十大热点展望.pdf(附下载链接)
  2. 【白皮书分享】2021年B2B内容营销白皮书.pdf(附下载链接)
  3. 专访头条搜索:从推荐到搜索,如何构建搜索技术的另一种可能?
  4. leetcode力扣17.电话号码的字母组合
  5. io hang linux 原理,Linux 避免IO hang
  6. 网络相关的常用协议总结
  7. 关于联合体输出的问题(是否小端模式)
  8. 【PHP 开发】mac 在 PHP 环境安装 mcrypt 扩展的方法
  9. C语言mutex使用案例,C语言 如何使用互斥锁严格交替使用两个线程?
  10. android系统 wifi,Android系统wifi分析-手动连接过程