软件设计之美
郑晔
开源项目 Moco 作者
19890 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

17 | 函数式编程:不用函数式编程语言,怎么写函数式的程序?

你好,我是郑晔!
前面几讲,我们讲了结构化编程和面向对象编程,对于大多数程序员来说,这些内容还是比较熟悉的。接下来,我们要讨论的函数式编程,对一些人来说就要陌生一些。
你可能知道,Java 和 C++ 已经引入了 Lambda,目的就是为了支持函数式编程。因为,函数式编程里有很多优秀的元素,比如,组合式编程、不变性等等,都是我们值得在日常设计中借鉴的。即便我们使用的是面向对象编程语言,也可以将这些函数式编程的做法运用到日常工作中,这已经成为大势所趋。
但是,很多人学习函数式编程,刚刚知道了概念,就碰上了函数式编程的起源,遇到许多数学概念,然后,就放弃了。为什么学习函数式编程这么困难呢?主要是因为它有一些不同的思维逻辑,同时人们也缺少一个更好的入门方式。
所以,在这一讲中,我打算站在一个更实用的角度,帮你做一个函数式编程的入门。等你有了基础之后,后面两讲,我们再来讨论函数式编程中优秀的设计理念。
好,我们开始吧!

不断增加的需求

我们从一个熟悉的场景出发。假设我们有一组学生,其类定义如下:
// 单个学生的定义
class Student {
// 实体 ID
private long id;
// 学生姓名
private String name;
// 学号
private long sno;
// 年龄
private long age;
}
// 一组学生的定义
class Students {
private List<Student> students;
}
如果我们需要按照姓名找出其中一个,代码可能会这么写:
Student findByName(final String name) {
for (Student student : students) {
if (name.equals(student.getName())) {
return student;
}
}
return null;
}
这时候,新需求来了,我们准备按照学号来找人,代码也许就会这么写:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

函数式编程是一种独特的编程范式,强调函数的重用和组合。本文通过一个学生信息查询的例子,展示了如何使用函数式编程的思想来消除重复代码,提高代码的灵活性和可复用性。通过引入查询条件的概念,作者演示了如何使用Predicate接口和Lambda表达式来实现不同的查询需求,并展示了如何组合不同的查询条件来满足复杂的需求。函数式编程的核心思想是让代码的作者提供基本元素,而代码的用户通过组合这些基本元素完成真正的需求。文章通过实际的例子,让读者对函数式编程有了初步的印象,为后续深入了解函数式编程奠定了基础。函数式编程的要素是一等公民的函数,如果语言不支持,可以自己模拟。函数式编程将函数视为构造块,通过组合这些函数构造出新的功能,展现了函数式编程的魅力。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(23)

  • 最新
  • 精选
  • 骨汤鸡蛋面
    基于函数切分逻辑跟基于对象切分逻辑有何异同嘛?

    作者回复: 下一讲会讲函数式编程的组合性,会提到这个问题,简言之,函数式切分的是动词,面向对象切分的是名词。

    2020-07-03
    18
  • Demon.Lee
    拆成一个个小组件,然后就是随意组合搭积木。面向对象编程的基础组件就是类,而函数式编程就是函数。

    作者回复: 对,是这个意思。

    2020-07-03
    2
    10
  • 被雨水过滤的空气
    函数式编程给我印象最深的就是“纯函数”的概念。想想看,如果程序是由一个个纯函数组成的,那么在实现每一个函数的时候,不需要关心外界的情况,并且还可以利用缓存提高性能。

    作者回复: 后面我们会讲到纯函数,也会讲到缓存的做法,敬请期待。

    2020-07-03
    8
  • Geek_0315ca
    函数式编程给自己提供了一种新的代码重构思路-通过函数单元将数据逻辑处理和条件隔离开来。另外,提升了自己的编程抽象思维,多态不是绝对依赖于继承,而是依赖于函数。“走路像鸭子,叫声像鸭子,那么它就是鸭子”,这就是多态思想。有幸看过go语言的开源项目,对多态思想有了新认识,提高了编程抽象思维。设计关注点开始从关注细节实现向宏观统筹开始转变。

    作者回复: 道理很简单,只是市面上这么讲的东西太少了。

    2021-01-29
    5
  • Jxin
    demo里面,感觉消除重复不怎么明显(虽然调用侧少了恶心的ifelse,但整体代码量反而变多了)。反而适配的味道很重。将所有equest判断适配成统一规格的Predicate 函数。调用侧基于Predicate 函数(统一规格的接口)做职责链链式调用。挺复合统一多个类的接口设计的一应用场景。

    作者回复: 这取决于给使用端提供多大的灵活度,灵活度大,这个设计才有意义。

    2020-07-03
    4
    5
  • bigben
    java有空lambda之后好,代码精炼了很多,但有些人表示看不懂了,增加了理解难度

    作者回复: 用好 lambda 的第一条,不要在 lambda 里写太多代码。

    2020-07-03
    3
    5
  • qinsi
    zipper吧,对immutable的递归数据结构进行遍历和修改,很精致的copy on write

    作者回复: 很好地分享

    2020-07-03
    3
    4
  • kylin
    函数是一等公民,当时刚刚接触函数式编程是学习clojure和js时,当时感觉特别绕的地方就是js中函数里面定义函数,返回函数,通过闭包保存状态,这些特性完全可以不使用对象就可以实现很多功能。

    作者回复: 是啊,函数式编程已然是一套独立的体系,是图灵完备的。

    2020-07-14
    3
  • 阳仔
    函数式编程范式里,函数是一等公民,有了函数式编程就可以封装复用的逻辑代码,还可以组合这些逻辑代码 语言设计越往后它是不断会进化的,毕竟这个世界里唯一不变的就是变化

    作者回复: 这个总结是到位的。

    2020-07-03
    2
  • ifelse
    函数式编程的要素是一等公民的函数,如果语言不支持,可以自己模拟。--记下来 记得刚开始用java的lambda语法,想在里面修改元素的值,结果就是不行,搞得我有点火🔥,觉得太不方便了。后来才知道,这就是lambda的约束,"不变性""。

    作者回复: 不理解编程范式,就会把所有编程范式都用成C语言。

    2022-05-15
    2
    1
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部