设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123426 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

83 | 开源实战三(下):借Google Guava学习三大编程范式中的函数式编程

课堂讨论
Guava对函数式编程的增强
Java对函数式编程的支持
函数式编程的特性
三种主流编程范式
函数式编程

该思维导图由 AI 生成,仅供参考

现在主流的编程范式主要有三种,面向过程、面向对象和函数式编程。在理论部分,我们已经详细讲过前两种了。今天,我们再借机会讲讲剩下的一种,函数式编程。
函数式编程并非一个很新的东西,早在 50 多年前就已经出现了。近几年,函数式编程越来越被人关注,出现了很多新的函数式编程语言,比如 Clojure、Scala、Erlang 等。一些非函数式编程语言也加入了很多特性、语法、类库来支持函数式编程,比如 Java、Python、Ruby、JavaScript 等。除此之外,Google Guava 也有对函数式编程的增强功能。
函数式编程因其编程的特殊性,仅在科学计算、数据处理、统计分析等领域,才能更好地发挥它的优势,所以,我个人觉得,它并不能完全替代更加通用的面向对象编程范式。但是,作为一种补充,它也有很大存在、发展和学习的意义。所以,我觉得有必要在专栏里带你一块学习一下。
话不多说,让我们正式开始今天的学习吧!

到底什么是函数式编程?

函数式编程的英文翻译是 Functional Programming。 那到底什么是函数式编程呢?
在前面的章节中,我们讲到,面向过程、面向对象编程并没有严格的官方定义。在当时的讲解中,我也只是给出了我自己总结的定义。而且,当时给出的定义也只是对两个范式主要特性的总结,并不是很严格。实际上,函数式编程也是如此,也没有一个严格的官方定义。所以,接下来,我就从特性上来告诉你,什么是函数式编程。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

函数式编程是一种备受关注的主流编程范式,通过介绍Google Guava对函数式编程的增强功能,本文带领读者了解函数式编程的特性和应用场景。函数式编程将程序描述为数学函数或表达式的组合,具有无状态的特点,函数的执行结果只与入参有关,不依赖外部变量。尽管函数式编程在科学计算、数据处理、统计分析等领域能够发挥优势,但并不适合所有程序的实现。相比于面向对象编程,函数式编程能用更少的代码实现相同功能,但在强业务相关的大型系统开发中,面向对象编程更加合适。Java对函数式编程的支持主要体现在Stream类、Lambda表达式和函数接口的引入,使得函数式编程在Java中更加便捷。Google Guava虽然对函数式编程的支持有限,但在遍历集合操作方面做了优化,使得函数式编程在遍历集合时能够大大简化代码编写,提高可读性。文章通过比较函数式编程与其他编程范式的特点,帮助读者更好地理解函数式编程的概念和适用场景。作者强调不要滥用函数式编程,以免导致代码可读性变差。函数式编程虽然在特定领域有其特殊作用,但并不能完全替代面向对象、面向过程编程范式。函数式编程的优点在于能用更少的代码实现相同功能,但滥用会导致代码可读性变差。欢迎读者分享对函数式编程的看法和讨论。

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

全部留言(40)

  • 最新
  • 精选
  • 小喵喵
    函数式编程是无状态的,它和接口的幂等性设计有什么区别呢?是不是接口的幂等性设计可以用函数式编程来实现呢?

    作者回复: 两个层面的东西,不怎么相关。只能说函数式编程符合幂等性。

    2020-05-13
    3
    4
  • 张三丰
    如果有两个未实现方法,参数返回值不一样呢,这种就可以了吧 实际上,函数接口就是接口。不过,它也有自己特别的地方,那就是要求只包含一个未实现的方法。因为只有这样,Lambda 表达式才能明确知道匹配的是哪个接口。如果有两个未实现的方法,并且接口入参、返回值都一样,那 Java 在翻译 Lambda 表达式的时候,就不知道表达式对应哪个方法了。

    作者回复: 可以根据入参和返回值来区分,不过这样设计起来就比较麻烦了,万一有入参和返回值一样的两个函数咋办呢,你说是吧

    2020-07-20
    1
  • javaadu
    我对函数式编程的看法有几点 1. 在集合操作方面非常强大,集合遍历、过滤、转换、分组等等,我现在在工作中经常用 2. 函数式编程的语法对于设计模式来说是一种具体的实现方式,可能代码行数会比较少,但是思路是一样的,所以最重要的还是前面一直强调的设计原则 3. 函数式编程最大的两个特点:函数是一等公民、函数没有副作用、强调对象的不变性,对于我们在面向对象编程时处理并发问题有指导意义
    2020-05-13
    62
  • 辣么大
    视角不同: FP:数据围绕操作 OOP:操作围绕数据
    2020-05-13
    1
    32
  • bboy孙晨杰
    复杂的业务逻辑我一般不会用函数式编程,可读性差,也不方便debug。。。发这条评论的主要目的是庆祝自己这几个月落下的进度终于补上了,哈哈
    2020-05-13
    13
  • 小晏子
    我觉得函数式编程并不能代替面向对象语言,并不是适合除了数学计算分析等大部分的场景,从系统设计的角度来讲,使用面向对象设计还是更亦理解的方式。 函数式编程的优点: 1. 代码量少,比如文中的例子就是最直接的展示。 2. 因为都是“无状态函数”,固定输入产生固定输出,那么单元测试和调试都很简单 3. 同样是因为无状态,所以适合并发编程,不用担心兵法安全问题。 缺点: 1. 滥用函数式编程会导致代码难以理解,比如一大型项目有大量高阶函数混着变量,开发人员随意把函数当作参数和返回值,项目会变得很难维护。 2.函数式编程会导致大量递归,算法效率太低。
    2020-05-13
    13
  • 迷羊
    Java8的函数式编程太香了,点点点很爽。
    2020-05-13
    2
    9
  • 李二木
    最爽莫过于集合遍历。简单集合遍历 一行就可以搞定。太多for看这难受。
    2020-05-14
    8
  • Jxin
    a.优缺点: 优 1.代码量少(可读性相对就高,开发成本相对就低) 2.无状态,纯函数(幂等)。(可测试性就好,对并发编程友好,对迁移serverless友好) 1.每个函数返回的都是一个新对象。(额外的资源成本) 2.设计难度高。(设计一个恰到好处的领域对象难,设计一个符合“函数编程思想”的表达式也难)。难就意味着成本,意味着不好推广普及。 缺 3.相较于面向对象对业务流程的抽象。函数表达式更像是对业务流程做重定义。 相对更不易于理解。 b.能取代面向对象吗? 不能。与文中相驳的点是,我认为函数式编程可读性其实更好(代码量少),可维护性也更好(可测试性)。但是函数式编程的代码和具体的业务流程间的映射关系,更难理解。这会导致要设计出一个完美满足业务流程的代码会比较难,需要有更多的转换和考量。而面向对象在构建这种业务模型上,只是对原业务流程做抽象,相对更好理解。其传承能力,以及跨部门达成共识的能力都远优于函数式编程。 我看好函数式编程,在无状态的计算领域,和一些高并发场景,它能发挥出很优益的价值。只是取代面向对象这种就有点过了。目前来看各有其应用场景,按需选择是挺好的方式,不必执着于谁替换谁。毕竟从结果来看,就连流程式编程,也不是面向对象能完美替代的。各有应用场景,关键在权衡。
    2020-05-13
    8
  • 落尘kira
    Java的函数式编程有一定的学习成本,而且由于强调不可变性,导致必须要求外部参数为final,这种情况下就老老实实的for循环;另外就是语法糖真香,相比原生的Stream,Flux更香
    2020-05-13
    4
收起评论
显示
设置
留言
40
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部