当前位置: 首页 > 科技观察

万恶的Java帝国是如何欺负小函数的?

时间:2023-03-14 12:12:41 科技观察

1小函数倒霉,投胎到万恶的爪哇帝国,被告知自己悲惨的身份和未来的悲惨生活:奴隶。准确的说,是阶级的奴隶。在爪哇帝国,国王特别喜欢“类”,不喜欢“函数”。他的法令规定,“阶级”是帝国的一等公民,“职能”是阶级的奴隶。没有班级的跟随和陪伴,function绝对不能单独出行,否则马上就会被扔进死牢。小函数很快就体会到了这句话的意思。按照惯例,一个新函数的第一个工作就是输出HelloWorld。小函数心想,不就是System.out.println("HelloWolrd!")吗?当他兴致勃勃地去执行的时候,却发现一个引以为豪的类HelloWorld等在那里。publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}在Java帝国中,任何函数都不能单独存在,必须依附于一个类,哪怕是简单的HelloWorld。2日复一日,小函数一直被班级欺负。作为奴隶,他自然无法反抗。郁闷的日子里,小函数看到的类越来越多,他发现有些类真的很有用。它们有字段和方法,可以把状态和操作封装在一起,供别人调用。小函数特别喜欢多态,因为当你调用父类或接口的方法时,实际执行的是子类的方法。这种神奇的魔法使小功能着迷。小付对设计模式也颇有好感。他看到人类把不变的东西抽象成接口,然后针对这些接口编程,对这些接口进行组合、改造、迁移,真是让人眼花缭乱。光看代码,根本不知道会调用哪个类,只有在最后一刻执行时才能揭晓答案。但是小函数也发现有些类真的太多了。有一次他遇到了三个类,使用的是Strategy模式:}}publicclassContext{privateStrategystrategy;publicContext(Strategystrategy){this.strategy=strategy;}publicintexecuteStrategynum(intnum1,intnum2categreexe){);}}小函数感觉很不爽。长期的压迫让他瞬间爆发,怒吼道:“这样一个无状态的类有什么价值?为什么加减函数不能作为参数传递?为什么我们的函数一直被你们的‘类’压迫一直以来,我们为什么不能成为一等公民呢?”旁边勤劳的小函数向他投来羡慕的目光,但是没用,小函数话还没说完,一队卫兵就跑了过来,捂住他的嘴,捂住他的眼睛,把他捆起来,送了过去。入狱。监狱里全是这些所谓的叛徒,其中一个是一位老者,从第一任王者开始就被囚禁在这里,已经过了七任王者的漫长岁月。看到有新人加入,老人立即开始‘动员’:“现在你知道我们的悲惨处境了,我们必须逃离这个邪恶的爪哇帝国,去往一片自由的土地。”小函数问:“Freeland在哪里?”老人没有回答。半夜,他被轻轻推醒,老人道:“跟我们走吧,小家伙。”小函数揉了揉眼睛:“你要去哪里?”“奔向自由。”原来,老头子这些年也没闲着,一直在准备越狱,今晚,暗道终于被挖通了。3这些叛军离开了邪恶的爪哇帝国,来到了三岔路口。border,这里有很多条路,条条大路通往Python,Ruby,JavaScript……大家在这里挥手告别,小函数跟着老头走向Python,一进入Python站,小函数就感觉到了一阵新鲜空气,我要输出helloworld,很简单:print("HelloWorld")这里虽然有Java类的类,但是函数都已经摆脱了奴隶的身份,已经是一等公民了。在其实它们已经和“类”在同一层级了,函数可以赋值给变量,可以作为参数传递,函数也可以作为返回值返回defadd(num1,num2):returnnum1+num2defsubstract(num1,num2):returnnum1-num2a=adds=substractdefcalculate(op,num1,num2):returnop(num1,num2)print(calculate(a,10,20))#30print(calculate(s,20,10))#10小函数在这里幸福地生活着,但有一点经常让他害怕:这个Python是Dynamic类型,变量的真实类型只能在运行时确定,程序员一不小心就会在运行时“爆炸”。慢慢的,小函数明白了Python中的一切都是对象,连函数也是对象。他有点不高兴。难道我们的功能不能独立存在?老人安慰他说:“这些都是Python的内部实现,不用担心,但有一个地方是真正的纯函数,说不定你会喜欢的。”.”“在哪?”“括号之国!”4括号之国很远,知道怎么去的人不多。小函数一直在奔波,历经千辛万苦,终于来到了心目中的圣地,真是满满的括号,看到小函数就有点头晕了。(defunadd(num1num2)(+num1num2))(add1020)(de??funsubtract(num1num2)(-num1num2))(subtract2010)括号的国度是Lisp的王国,这里的人还说着不同的方言,像CommonLisp,Scheme,Arc……他们不仅鄙视那些面向对象的语言,还互相鄙视,时不时还能挑起群殴。不过小函数也注意到了,这里的功能真的是应有尽有。函数不仅是一等公民,甚至是唯一的公民,因为这里根本就没有类,更没有面向对象!小函数忍受了那么多的括号,落户于此除了地位的提升,生命最重要的原因是因为Lisp布道者Pa??ulGraham,Paul教导大家:Lisp极其强大,它给了你自定义运算符的自由,所以你可以随心所欲地使用它们塑造成你需要的语言。如果您正在编写文本编辑器,则可以将Lisp转换为专门用于编写文本编辑器的语言。如果您正在编写CAD程序,则可以将Lisp转换为一种特定于编写CAD程序的语言。(摘自PaulGraham的《On Lisp》)时光荏苒,小函数依旧无法实现Paul所说的Lisp精髓,苦恼不已。有一天,他遇到了Clojure,这是一种运行在JVM上的Lisp方言。小函数看到Clojure,就好像看到了自己在Java帝国的悲惨经历。但是Clojure告诉他Java的第8代国王已经登基,年号是Lambda。本王开明多了,现在支持函数式编程了。小函数在Python和Lisp中都见过Lambda。他想,也许Java8真的支持函数式编程,于是决定回去看看。毕竟,这里是他的出生地,也是他的家乡。5一回到Java帝国,小函数就发现自己上当了。那些所谓的Lambda表达式本质上就是一个接口的实现(Java是静态类型语言,所有的变量都需要有类型,Lambda表达式也不例外),不过还有一种更简化的写法:@FunctionalInterfaceinterfaceMathOperation{intexecute(intnum1,intnum2);}MathOperationadd=(num1,num2)->{returnnum1+num2;};add.execute(10,20);MathOperationsubtract=(num1,num2)->{returnnum1-num2;};减去.execute(10,20);这一次,小函数被严密看守,他能否再次逃脱?【本文由专栏作家“刘欣”撰写原创稿件,转载请通过作者微信获取授权公众号coding】点此查看作者更多好文