本文基于 如何优雅地链式取值

可能有人之前看过我写的关于函数式编程的东西,也有人看过这一篇文章。由于我还是学生,开发经验相对较少,所以对于函数式编程如何应用存在一些疑惑。之前也问过面试官,说是实际开发中用的比较少,因为别人可能需要通读你的代码才能明白你写的东西。但是这篇文章就提供给了我一个很好的应用函数式编程的机会。

从 如何优雅地链式取值 这篇文章的描述中,可以看出处理嵌套层级特别深的代码经常会由于数据的原因而出一些错。例如下面呢这种数据

const res = {data:{oneGoods:{lists:[{price: 1,name:'apple'}]},antherGoods:{lists:[{price: 2}]}}
}

假设我们想对 oneGoods 里面的 lists 中的商品的 name 进行操作,我们可以这么写

res.data.oneGoods.lists[0].name.toUpperCase()
// APPLE

那么问题就来了,假设 name 不存在呢,这就会报错,导致程序终止。例如

res.data.antherGoods.lists[0].name.toUpperCase()
// Cannot read property 'toUpperCase' of undefined

或者再极端一点,lists 中没有那一项

res.data.antherGoods.lists[1].name.toUpperCase()
// Cannot read property 'name' of undefined

有哪些方式那篇文章已经说的差不多了,但是有一种没有提到,就是使用函数式编程的 MayBe 函子。来看看用 MayBe 函子怎么做吧。

其实在 函数式编程之函子 中已经说过了,这里再简单介绍一下吧。

const MayBe = function(val){this.val = val;
}MayBe.of = function(val){return new MayBe(val);
}MayBe.prototype.isNothing = function(){return this.val===undefined || this.val===null;
}MayBe.prototype.map = function(fn){return this.isNothing() ? MayBe.of(null):MayBe.of(fn(this.val));
}

首先函子是一个实现了 map 方法的普通对象。MayBe 能够保存任何传进来的值。MayBe.of 是一个静态方法,能够返回一个新的 MayBe 实例。然后它实现了 map 方法,在执行 map 方法时会调用 isNothing 方法进行判断,如果为 null 或者 undefined 就会返回一个值为 null 的对象。

那么用这个怎么处理之前的链式调用呢。

MayBe.of(res).map(res=>res.data).map(data=>data.oneGoods).map(oneGoods=>oneGoods.lists).map(lists=>lists[0]).map(list=>list.name).map(name=>name.toUpperCase())
// MayBe {val: "APPLE"}
MayBe.of(res).map(res=>res.data).map(data=>data.antherGoods).map(oneGoods=>oneGoods.lists).map(lists=>lists[0]).map(list=>list.name).map(name=>name.toUpperCase())
// MayBe {val: null}
MayBe.of(res).map(res=>res.data).map(data=>data.antherGoods).map(oneGoods=>oneGoods.lists).map(lists=>lists[1]).map(list=>list.name).map(name=>name.toUpperCase())
// MayBe {val: null}

虽然看起来并不简单,其实逻辑比较简单,就是代码多了一点。但是这种链式调用的话类似于 promise,所以使用起来特别舒服,而且它把对于错误的处理抽象了出来,让我们无需关系这部分。所以也是一种很好的解决方案。

总归也找到了函数式编程的一种应用场景,不同的方案有不同的好处,多了解一些东西总能拓宽自己的思路吧。而且那篇文章没有提到可能是因为没有想到 MayBe 函子的应用场景,或者不太了解函数式编程,也算是对那篇文章的一个补充吧。希望能引起大家学习函数式编程的兴趣?

如何优雅的链式取值之 MayBe 函子相关推荐

  1. 如何优雅安全地在深层数据结构中取值

    古有赵子龙面对"冲锋之势,有进无退,陷阵之志,有死无生"的局面,能万军丛中取敌将首级. 在我们的Javascript中,往往用对象(Object)来存储一个数据结构.如果这个结构非 ...

  2. 引用 一个较优雅的GridView隐藏列取值解决方案

    在Asp.net 2.0中增加了一个新的数据绑定控件:GridView,其目的用来取代Asp.net1.x中的DataGrid控件,但有一点很不爽的是,如果把某列设置为visible=false,则不 ...

  3. Java学习第十二天----方法参数类型以及返回值类型问题、链式编程、package包、权限修饰符、内部类、成员内部类

    Java学习第十二天----方法参数类型以及返回值类型问题.链式编程.package包.权限修饰符.内部类.成员内部类 1.方法参数类型: (1)类名作为形式参数: public class MyTe ...

  4. java当数值超过byte时_【Java学习重难点记录】byte数据类型在显式类型转换时超出其取值范围的转换过程...

    写在前面 本文章转载于我的个人blog UltraFisher,欢迎大家浏览: https://ultrafisher.github.io 原文链接:https://ultrafisher.githu ...

  5. 开发过程(链式)代码处理NPE的几种方式以及优雅解决方案。

    在实际开发过程中,有些代码逻辑是需要表类(通过数据库的表建立的类)之间的关系来实现的.比如一个简单的需求:就是要找到一个客户的所属市场的名字,在我的现有的公司业务上的代码逻辑是: String mpN ...

  6. 优雅的python_18式优雅你的Python

    本文来自读者梁云同学的投稿,公众号:Python与算法之美 一,优雅你的Jupyter 1,更改Jupyter Notebook初始工作路径 平凡方法: 在cmd中输入jupyter notebook ...

  7. c语言队列如何表示,队列的链式表示和实现(C语言)

    #include #include #define OK 1; #define ERROR 0; #define OVERFLOW 0; #define TURE 1; #define FALSE 0 ...

  8. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  9. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

最新文章

  1. spyder 崩溃解决方案
  2. HTTP Status 403 - Access to the requested resource has been denied
  3. uva 294 ——Divisors
  4. 这个代码应该怎么写???
  5. 湖南工业大学在线计算机作业答案,湖南工业大学《计算机组成原理》试题集,共7份,有部分答案...
  6. 如何开始使用centos_如何开始使用CentOS
  7. python使用osgeo库_MAC下python2.7的GDAL库配置问题
  8. 命令行下(bat)使用 Lhaplus 自动 压缩 解压文件 (含参数设定说明)
  9. “fatal error C1010”错误解决的三种方法
  10. AcWing提高算法课Level-3 第四章 高级数据结构
  11. WSL2 jupyter notebook 在windows主机打开
  12. 长安大学微型计算机原理与接口技术答案,长安大学微机原理与接口技术AB卷试题与答案.doc...
  13. 全新的小米,从更流畅,更安全,更智慧的MIUI 14开始
  14. python求两个数的最大公约数穷举法_五十九、如何求N个数的最大公约数和最小公倍数...
  15. python bind绑定失败_Python tkinter之Bind(绑定事件)的使用示例
  16. LOJ #10005. 「一本通 1.1 练习 1」数列极差
  17. 矩阵的奇异值分解过程
  18. 图表点编辑数据无反应_我快疯了!为什么我的excel里的图表不能编辑数据!
  19. linux 网卡绑定team和删除team
  20. java8双冒号(::)的使用(方法引用)

热门文章

  1. 数字通信系统中的均衡技术
  2. 如何为你的博客园添加到百度统计
  3. python全栈-Day 1
  4. English trip -- Phonics 3 元音字母e
  5. Hibernate---对象的三种状态
  6. 前端笔记----定位
  7. mysql为字段值添加或者去除前缀、后缀(查询字段拼值)
  8. python随机生成数字列表_详解Python利用random生成一个列表内的随机数
  9. 任意门怎么用团发_平开门、推拉门都out了!衣柜门这样设计,实用方便又大气!...
  10. SAS宏保存以便快速调用的三种解决方案(转载)