不知道为什么,我很厌恶 map()

levelworm · 2025-2-1 01:17:26 · 1770 次点击

首先声明一下,我承认我是个很烂的程序员。我甚至不愿意承认自己是程序员。(也许这就是原因?)

因为公司转向 Flink ,所以今天决定学习一下。但是不知道为什么,看到 map()就觉得生理上的厌恶,和看见一只蟑螂一样。

其实我自己也不能理解这种厌恶--我能理解为什么自己不喜欢,因为 map()本身没有可读性,你看到这个,就得去里头看到底是调用了什么函数。但是我不知道为什么我会有生理上的厌恶。同理,我在 PySpark 里看到 map(),也会极其厌恶,尤其是配合 lambda 食用,则更加厌恶。比如说

result = map(lambda x: x["id"], data["item"])

看到一次我就恶心一次。

不知道有没有类似的朋友,你们是如何克服的?我看了一下,Flink 里似乎无法避免 map()。所以只能自己习惯了。

举报· 1770 次点击
登录 注册 站外分享
16 条回复  
iintothewind 小成 2025-2-1 01:37:07
那是因为你用的 Python, 强类型动态语言, 而且传入参数没有 type hint 的原因吧. 你试试用用 Scala 不就好多了.
sagaxu 初学 2025-2-1 01:40:10
跟你相反,我非常喜欢 map/filter/reduce/fold/chunk...,意图+操作,可读性强,且非常直观
levelworm 楼主 初学 2025-2-1 01:47:46
@sagaxu #2 问题在于,map()意图清晰在哪里?只是知道要做个变换,具体是什么还得看里头啊。还是说我理解错了? 好吧,也许改成 transform()我就能接受了。真是奇怪的心理。
levelworm 楼主 初学 2025-2-1 01:48:25
@iintothewind #1 有可能,但是我觉得 Python 那段,用 list comprehension 就好很多。
aresyang 初学 2025-2-1 02:08:55
或许了解 fold_left mnist 后就还好
netabare 小成 2025-2-1 02:21:59
不过是个 Functor 而已。 或者也许 Python 的 lambda 语法太丑了。要是换成 map (fn x => x + 1) [1,2,3,4] 这不就清晰多了吗。 List comprehension 这玩意能出现的前提是它是个 monad ,按照那个著名的话,monad 得先是个 functor ,换句话说能写出 list comprehension 的东西,它也肯定会写得出 map……这不就变成先有鸡还是先有蛋的问题了。
sagaxu 初学 2025-2-1 02:24:23
@levelworm map 的清晰点在于,我不必定义一个 array/list 数据结构,然后把元素转换后 append 上去,而是直接告诉数据源,对这个集合的每个元素做一个映射,得到一个新集合,剥离了数据结构实现细节。你觉得别扭,可能是因为 python 的 lambda 语法不太友好。
w568w 小成 2025-2-1 02:30:32
是这个 map 的命名和设计都比较反直觉。看到 map 这个单词,我大脑里的反应顺序是: 1. 创建 hashmap ? 2. 创建映射? 3. 哦都不对,是 ([a], f) -> [f(a)] 然后我自然的思考顺序是「对什么做映射?」,然后扫过第一个参数,发现是个很懵逼的 lambda 或者一个变量(然后往上翻了半天才发现这个变量是一个 function ),再仔细一想才发现不对,map 的第一个参数是映射…… 参数顺序这一点非常反人体工学,因为中文这个语言先说上下文,比如会说「对某物做什么事」,而不常说「做什么事对某物」:我得先知道你在操作什么列表,然后你 lambda 函数里的各种引用、操作对我才有意义。把映射函数放在前面,对我来说是一个非常破坏阅读心智连贯性的设计。
levelworm 楼主 初学 2025-2-1 02:37:23
@netabare 这倒是,不过我的确智商不足理解函数式编程,除非比较符合我的直觉。。。也可能用用就好了,反正逃不掉。
12下一页
返回顶部