use*_*855 10 java functional-programming clojure
我完全可以理解为什么Clojure非常适合并发编程.在这方面我也可以看到FP的优势.
但显然,并非我们编写的每行代码都是线程的一部分或需要并发访问.对于代码的那些部分(更简单和连续的代码片段),Java真正错过了Clojure提供的内容是什么?
在Java中真的错过了Multimethods,Dynamic binding,Destructuring bind等功能吗?
我想我的问题也可以被描述为:
Bri*_*per 25
在Java中真的错过了Multimethods,Dynamic binding,Destructuring bind等功能吗?
是.也...
一流的功能.美味的一流功能.这不仅仅是FP的事情.人们迫切要求Java 7中的闭包是有充分理由的.
代码是数据.这是任何Lisp的好处.Lisp代码不仅仅是您在编译器口中提供的文本blob,而且再也看不到它了,它可以通过编程方式操作列表和向量以及符号和文字的结构.这导致了强大的宏和一流的符号以及许多其他好东西.它导致了一种高度可扩展和强大的语言.
Clojure具有更好的控制和循环结构,以及通过宏和一流函数创建自己的能力.Java有for
和foreach
和while
(甚至没有foreach
为年).Clojure的有map
,filter
,reduce
,mapcat
,大量的do
形式,大量的if
和when
通过表格,列表解析for
,等等.如果这些不存在,您可以自己编写.在Java中,您需要等待十年才能成为一个委员会(也许)批准这些功能.
减去处理静态类型的所有功能,为Java 7设置的所有功能,Clojure要么已经拥有,要么可能具有琐碎性."自动资源管理",Clojure有with-open
."对集合的语言支持",Clojure(以及Ruby,Perl,Python ......)已经有了."切换中的字符串",Clojure具有更强大的类似案例的结构condp
,以及您能想到的任何其他内容.您可以在十几行Clojure中自己编写任何这些内容.
列表,地图,数组,集合,有序集,有序映射等的简明语法以及几乎可互换的使用都归功于seq
抽象.对正则表达式,字符,匿名函数等的字面支持
Java有强制检查的异常,这很烦人; Clojure没有.
Java语法冗长且不规则.Clojure语法简洁而有规律.即使Java编写Clojure中往往更简洁比Java用Java编写的感谢像宏->
和doto
,和结构,如proxy
与(即将)reify
.
Java代码有太多强制性的样板和无休止的重复. public static void main(String[] args){...}
Clojure几乎没有这个样板,而在表现力或力量方面几乎没有牺牲.即使是今天其他静态类型的语言似乎也在采用类型推理的方式.你需要一个庞大的以Java为中心的IDE来编写并无休止地"重构"Java代码,这是有充分理由的.用手写它会让你疯狂,把手指放到小块上.
在Java中,一切都是类或接口,无论是否应该,这是不必要的复杂性的原因.有许多程序必须被忽视以适应OOP风格.Clojure让你避免这种情况. 这种效果很好的咆哮. Clojure主要关注动词.
通过REPL进行交互式编程很有趣.编译/运行/调试周期不是.如果你想要的话,Clojure仍会编译成.class文件; 与此同时,您可以坐在代码中间,在运行时自由修补.
Clojure的元数据和理智的平等测试很愉快.正如它自动推广int到long到Bigint,本地处理有理数,等等.
动态类型导致更短,更通用,因此更可重用,因此比静态类型更强大的代码.(这显然是一个备受争议的问题,所以我把它放在最后.)
Scala和Groovy以及JRuby和Jython以及其他JVM语言的流行应该被视为一个很好的迹象,虽然JVM很好,但Java语言对很多人来说都是不愉快的.
小智 7
布莱恩已经很好地总结了它.这是给我留下深刻印象的东西.(摘自Stuart Halloway 编程Clojure)
Java代码,来自Apache Commons:
public class StringUtils {
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是Clojure中的类似实现:
(defn blank? [s] (every? #(Character/isWhitespace %) s))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
835 次 |
最近记录: |