请教关于函数式编程的优势

2022-10-01 12:08:30 +08:00
 lerefe

最近在看函数式编程相关的内容,并且结合公司一些人用函数式变成的处理,产生一个疑问,从算法复杂度和速度来说,很多时候一个循环能做到的事情,会用 lambda 循环多次处理,这样做的根据是什么?

8288 次点击
所在节点    Java
65 条回复
nightwitch
2022-10-01 16:07:02 +08:00
无状态的函数在并行编程时可以避免引入锁
july1995
2022-10-01 16:51:06 +08:00
@zxCoder var 因为作用域的问题,现在很少使用,一般用 let const 。var 还有重复声明的问题。
yigecaiji
2022-10-01 18:12:40 +08:00
@july1995 这是 Java ,不是 JavaScript ,还是说 Java 现在引入 let 了?
wdwwtzy
2022-10-01 18:20:22 +08:00
不得不说,这 java 的 stream 太难用了,也太难看了。
学学 C#的 linq 吧,大概是这样
books.GroupBy(b=> b.CategoryId)
.SelectMany(g => g.OrderBy(b=> b.Price).Take(1))
.ToList();
cp19890714
2022-10-01 18:28:59 +08:00
第二种,代码直接表明了意图,想做什么事就调用对应的函数,这更接近人的思维。
第一种,往往要把代码看完,才能猜出意图,而且使用很多无实际意义的临时变量,增加心智负担。
july1995
2022-10-01 18:39:48 +08:00
@yigecaiji 哈哈,抱歉,看错了看错了,图片加载不出来,又看到有人提到 var ,下意识认为这是 JavaScript 。
paopjian
2022-10-01 19:00:51 +08:00
看第一个还能理解,第二个感觉对函数的功能理解需要非常全面,忘了一个函数就得找半天相关方法了,感觉调用超过三层不用 ide 自动提示就不知道怎么写了
FrankFang128
2022-10-01 19:03:09 +08:00
函数式一直就不以执行速度为优先
Chad0000
2022-10-01 19:09:31 +08:00
@wdwwtzy
你就静静的看他们捧 Java 多好。
Rache1
2022-10-01 19:18:20 +08:00
@wdwwtzy Laravel 的 Collections 也不错 😏
ghui
2022-10-01 19:20:28 +08:00
新的思路提高抽象层次,你想干啥告诉我(声明式)就行了,具体怎么实现的调用者不需要关心
chihiro2014
2022-10-01 19:47:58 +08:00
普通的写法只是让我们编写逻辑不混乱。函数式是抽象了过程,只关心入参和结果
xuanbg
2022-10-01 20:37:01 +08:00
并不会有什么优势!
计算机可不会管你是不是函数式,编译完都是机器码。CPU 可不会因为你的机器码由函数式的代码编译而来就执行得快一些。
wupher
2022-10-01 20:37:10 +08:00
浅见:

1. 实际执行时多次 map / collect / filter 会被合并至一起,提升效率
2. 没有中间变量并发时更可靠和安全
3. 于 Actor/flow/Reactor 模式下,每一步都可拆解为一个事件 /信号,可以更好的利用多核进行并发处理。
mxT52CRuqR6o5
2022-10-01 20:40:46 +08:00
有一些约定俗称的函数能让你快速明白代码干了些什么
比较限制副作用类型代码的书写,减少阅读时的心智负担
mxT52CRuqR6o5
2022-10-01 20:46:15 +08:00
像你举的那个函数式的例子,逻辑写成了一条一条的,阅读的时候只需要从上往下阅读,只需要依次关注每一条的功能和作用,记住上一条代码的返回值就不需要再关心上一条代码具体做了些什么
像非函数式的那个例子,阅读的时候就需要整体都做了些什么,他在第一行声明了一个 map ,接下来的阅读中就需要时刻关心 map 具体发生了些什么,当前 map 的状态是什么
ChefIsAwesome
2022-10-01 21:13:42 +08:00
链,或者叫 flow ,因为函数是 pure 的,随便抽一段连续的,就得到了一个新的函数,就能拿到其它地方复用。这不就是程序员梦寐以求的最简单、也是最高级的模块化。
lmshl
2022-10-01 21:18:57 +08:00
资深函数式码农(自封)来扯两句:
于我而言函数式最大的优势在于,容易写对,且容易分析,容易理解。同时附带了容易并行的优势
而执行速度,函数式写法确实慢于专家优化过的指令式,但比普通 CRUD 农写的指令式代码更快是基本操作了。
loveyu
2022-10-01 21:32:07 +08:00
说句不好听的,见过大量在复杂业务逻辑盲目使用方式二导致的性能和阅读困难
Anarchy
2022-10-01 21:42:53 +08:00
对我而言就两点好处:
1. 提供操作符减少了部分操作代码编写
2. 整个代码结构从上到下就是对应逻辑链条,熟悉操作符很快就能看懂逻辑了
支撑使用的原因就是第二条了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884185

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX