工具类与函数编程毫不相干-Java开发Java经验技巧

工具类与函数编程毫不相干-Java开发Java经验技巧

ID:41722357

大小:195.27 KB

页数:6页

时间:2019-08-30

工具类与函数编程毫不相干-Java开发Java经验技巧_第1页
工具类与函数编程毫不相干-Java开发Java经验技巧_第2页
工具类与函数编程毫不相干-Java开发Java经验技巧_第3页
工具类与函数编程毫不相干-Java开发Java经验技巧_第4页
工具类与函数编程毫不相干-Java开发Java经验技巧_第5页
资源描述:

《工具类与函数编程毫不相干-Java开发Java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、工具类与函数编程毫不相干-编程开发技术工具类与函数编程毫不相干木文由ImportNew-treesouth翻译自yegor256。欢迎加入翻译小组。转载请见文末要求。最近,曲于我把工具类看作反模式,所以被指责反对函数式编程。这是绝对错误的!我认为它们是很糟糕的反模式,因为他们与函数式编程无关。我认为其中有两个基本原因。首先,函数式编程是可声明的,然而工具类方法是命令式的。第二,函数式编程是基于lambda演算,即被传递参数的函数。从这个意义上来说,工具类方法不是函数。我会用一点吋间来解释一下。在Java中,基本上有两种被Guava>Apa

2、cheCommons和其它开发库推荐使用的拙劣的工具类。第一种是使用传统的类,第二种就是Java8的lambda。现在让我们看看为什么工具类和函数式编程关系不大,以及错误观念的来源。这就是来源于Java1.0中Math工具类的一个典型示例:publicclassMath{publicstaticdoubleabs(doublea);//afewdozensofothermethodsofthesamestyle}当你想要计算一个浮点型数字的绝对值,你可以使用如下方式:doublex二Math,abs(3.1415926d);这里冇什么问题

3、呢?我们需要一个函数,并且我们从Math类屮得到了结果。这个类有许多有用的内置函数,可以用于许多典型的数学运算,比如计算最大值、最小值、正弦、余弦等。这是一个非常流行的概念,许多商业化或者开源产品也是如此。自从JavaH4!现(Math类在Java首个版本被引入),这些工具类就被广泛使用。当然,在技术上没有什么不妥。相反,他们是命令式和过程式的。我们是否在意呢?这取决于你的选择。让我们来看看他们冇什么区别。基本上有两种不同的选择,声明式和命令式。就改变程序状态的声明来说,命令式编程的重点是描述一个程序是如何运作的。我们刚刚看到了上面一个命

4、令式编程的例子。下面是另一个(这是一个和面向对象无关,纯粹的命令式并且程序化的代码):publicclassMyMath{publicdoublef(doublea,doubleb){doublemax=Math,max(a,b);doublex二Math,abs(max);returnx;就采取的一系列举措來说,声明式编程侧重于在没有规定如何做的情况下程序应该完成哪些事情。就像是Lisp中的代码,一种函数式编程语言。(defunf(ab)(abs(maxab)))我们明口了什么?只是句法的不同?不是这样的。在命令式和声明式之间有很多描述

5、差异,但是我尽量给出自己的理解。基本上有三种角色在使用f函数的场景下和互影响:买家、包装者和消费者,让我们谈一谈下面的调用:publicvoidfoo(){doublex=this.calc(5,-7);System・out.printin("max+absequalsto"+x);}privatedoublecalc(doublea,doubleb){doublex二Math,f(a,b);rcturnx;这个例子中,方法calc()是一个买家,方法血th.f()是结果的包装者,方法foo()是消费者。无论使用哪种编程风格,总是有这三个

6、参与其屮,买家、包装者,和消费者。想象一下,你是一个买家并希望购买礼物给你的女朋友或男朋友。首先会想到进一家店铺,消费50美元,让别人喷上香水打包给你,然后寄给你的朋友(冋报是一枚香吻),这是命令式的风格。第二个选项是进一家店铺,消费50美元,并得到一张礼品券,你将此券展示给你的朋友(M报是一•枚香吻)。当他或者她想要得到这股芳香,他或她就会进这家店来得到它。这就是声明式风格。看到什么区别了么?在笫一个场景中,这是命令式的风格,你要求包装者(一家店铺)使用库存中的香水来打包,并作为准备好的礼品呈现给你。在第二个场景屮,这是声明式的,你最终

7、得到了店铺的承诺,当必要的吋候店铺职员会找到香水来打包礼物,并提供给需要的人。如果你的朋友从來没有进过有礼品券的这家店,这股芳香将一直留在这家丿占屮。此外,你的朋友可以用这个礼品券当做这个礼品木身,就不用去这家店。他或她可能会将这张券作为礼物给其他人,或者用来交换其它礼券或者礼品。这个礼品券本身成为了一个礼品。因此,区别就是消费者得到了什么,是用来当做礼品(命令式)还是Z后可以转换成真实礼品的礼券(声明式)。工具类,就像从JDK中的Math类或者ApacheCommons中的StringUtils类中立刻得到了准备好的礼詁。然而,从Lis

8、p小的函数和其它函数式编程屮,却得到了“礼券”。比如,如果你想调用Lisp中的求最犬值的方法,但只冇当你真止开始使用的时候才能计算出來。(let(x(max15))(print〃Xequals

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。