Clojure真正针对Java而不是并发/不可变性特征相关的任何例子?

use*_*855 10 java functional-programming clojure

我完全可以理解为什么Clojure非常适合并发编程.在这方面我也可以看到FP的优势.

但显然,并非我们编写的每行代码都是线程的一部分或需要并发访问.对于代码的那些部分(更简单和连续的代码片段),Java真正错过了Clojure提供的内容是什么?

在Java中真的错过了Multimethods,Dynamic binding,Destructuring bind等功能吗?

我想我的问题也可以被描述为:

  • 如果Clojure没有它所具有的并发功能并且整个Immutability/Mutability问题不是我们关心的问题,那么Clojure提供的其他功能会让你使用它而不是Java?

Bri*_*per 25

在Java中真的错过了Multimethods,Dynamic binding,Destructuring bind等功能吗?

是.也...

  1. 一流的功能.美味的一流功能.这不仅仅是FP的事情.人们迫切要求Java 7中的闭包是有充分理由的.

  2. 代码是数据.这是任何Lisp的好处.Lisp代码不仅仅是您在编译器口中提供的文本blob,而且再也看不到它了,它可以通过编程方式操作列表和向量以及符号和文字的结构.这导致了强大的宏和一流的符号以及许多其他好东西.它导致了一种高度可扩展和强大的语言.

  3. Clojure具有更好的控制和循环结构,以及通过宏和一流函数创建自己的能力.Java有forforeachwhile(甚至没有foreach为年).Clojure的有map,filter,reduce,mapcat,大量的do形式,大量的ifwhen通过表格,列表解析for,等等.如果这些不存在,您可以自己编写.在Java中,您需要等待十年才能成为一个委员会(也许)批准这些功能.

  4. 减去处理静态类型的所有功能,为Java 7设置的所有功能,Clojure要么已经拥有,要么可能具有琐碎性."自动资源管理",Clojure有with-open."对集合的语言支持",Clojure(以及Ruby,Perl,Python ......)已经有了."切换中的字符串",Clojure具有更强大的类似案例的结构condp,以及您能想到的任何其他内容.您可以在十几行Clojure中自己编写任何这些内容.

  5. 列表,地图,数组,集合,有序集,有序映射等的简明语法以及几乎可互换的使用都归功于seq抽象.对正则表达式,字符,匿名函数等的字面支持

  6. Java有强制检查的异常,这很烦人; Clojure没有.

  7. Java语法冗长且不规则.Clojure语法简洁而有规律.即使Java编写Clojure中往往更简洁比Java用Java编写的感谢像宏->doto,和结构,如proxy与(即将)reify.

  8. Java代码有太多强制性的样板和无休止的重复. public static void main(String[] args){...}Clojure几乎没有这个样板,而在表现力或力量方面几乎没有牺牲.即使是今天其他静态类型的语言似乎也在采用类型推理的方式.你需要一个庞大的以Java为中心的IDE来编写并无休止地"重构"Java代码,这是有充分理由的.用手写它会让你疯狂,把手指放到小块上.

  9. 在Java中,一切都是类或接口,无论是否应该,这是不必要的复杂性的原因.有许多程序必须被忽视以适应OOP风格.Clojure让你避免这种情况. 这种效果很好的咆哮. Clojure主要关注动词.

  10. 通过REPL进行交互式编程很有趣.编译/运行/调试周期不是.如果你想要的话,Clojure仍会编译成.class文件; 与此同时,您可以坐在代码中间,在运行时自由修补.

  11. Clojure的元数据和理智的平等测试很愉快.正如它自动推广int到long到Bigint,本地处理有理数,等等.

  12. 动态类型导致更短,更通用,因此更可重用,因此比静态类型更强大的代码.(这显然是一个备受争议的问题,所以我把它放在最后.)

Scala和Groovy以及JRuby和Jython以及其他JVM语言的流行应该被视为一个很好的迹象,虽然JVM很好,但Java语言对很多人来说都是不愉快的.

  • 你的观点#10真的与Java或Clojure没有任何关系.它是实现的特征,实际上甚至不是,它更像是开发环境的特征.Eclipse已经开始作为Smalltalk IDE,它已经有了十年的Java REPL,它只是隐藏得很好.Mono有一个C#REPL.那里有C和C++解释器,它们都有REPL.F#,Scala,Haskell有REPL.不过,100%同意你的其他11分. (2认同)

小智 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)