Clojure在哪些示例中真正针对与并发性/不变性特性无关的Java大放异彩?

Clojure在哪些示例中真正针对与并发性/不变性特性无关的Java大放异彩?,java,functional-programming,clojure,Java,Functional Programming,Clojure,我完全明白为什么Clojure真的适合并发编程。在这方面,我也看到了FP的优势 但很明显,我们编写的并非每一行代码都是线程的一部分或需要并发访问。对于代码的这些部分(更简单、更连续的代码),Java真正错过了Clojure提供的是什么 Java中是否真的缺少诸如多方法、动态绑定、解构绑定之类的功能 我想我的问题也可以用以下方式表达: 如果Clojure没有 它拥有的并发特性和 整体不变性/易变性 那个么,这个问题不是我们所关心的 Clojure还提供了哪些其他功能 那会让你用它来代替 爪哇 对

我完全明白为什么Clojure真的适合并发编程。在这方面,我也看到了FP的优势

但很明显,我们编写的并非每一行代码都是线程的一部分或需要并发访问。对于代码的这些部分(更简单、更连续的代码),Java真正错过了Clojure提供的是什么

Java中是否真的缺少诸如多方法、动态绑定、解构绑定之类的功能

我想我的问题也可以用以下方式表达:

  • 如果Clojure没有 它拥有的并发特性和 整体不变性/易变性 那个么,这个问题不是我们所关心的 Clojure还提供了哪些其他功能 那会让你用它来代替 爪哇

    • 对于一个人来说,Clojure的“仪式”通常要少得多。Python和Ruby等语言也比Java具有这一优势(因此JRuby、Jython的流行)

      但请注意,在Java中有时无法避免冗长,尽管可能有一个清晰的模式。Clojure的宏在这里是一个巨大的胜利——甚至超过了其他类似的动态语言

      另一个需要考虑的问题是Culjule程序趋向于并发安全。因此,如果您决定让某个特定的应用程序并发,这不会太痛苦。如果事先不做很多决定,那么使用Java将非常困难

      如果Clojure缺少强大的并发原语和不变性,那么它是否比Java有明显的优势,就像在说:“如果Clojure不是Clojure呢?”

      Java中是否真的缺少诸如多方法、动态绑定、解构绑定之类的功能

      对。还有

    • 第一类函数。美味的一流功能。这不仅仅是FP的事情。人们叫嚣Java7中的闭包有一个很好的理由

    • 代码就是数据。这是任何Lisp的优点。Lisp代码不仅仅是输入到编译器口中的文本块,再也看不见了,它是列表、向量、符号和文字的结构,可以通过编程进行操作。这就产生了强大的宏、一流的符号和许多其他好东西。它产生了一种高度可扩展且功能强大的语言

    • Clojure具有更好的控制和循环结构,并且能够通过宏和一流函数创建自己的。Java有
      for
      foreach
      (而且多年来甚至没有
      foreach
      )。Clojure有
      map
      filter
      reduce
      mapcat
      ,大量
      do
      表单,大量
      if
      when
      表单,通过
      列出理解,等等。如果这些不存在,你可以自己写。在Java中,你需要等待十年,等待一个委员会(也许)批准这些特性

    • 除了那些处理静态类型的特性,Clojure的所有特性都已经具备或可能具备。“自动资源管理”,Clojure具有开放式的as
      。“对集合的语言支持”,Clojure(以及Ruby、Perl、Python…)已经发布了。“开关中的字符串”,Clojure具有更强大的类似于大小写的结构,如
      condp
      ,以及您能想到的任何其他结构。你可以自己用十几行Clojure来写这些

    • 列表、映射、数组、集合、排序集、排序映射等的简明语法,以及它们的几乎可互换的使用都要归功于
      seq
      抽象。对正则表达式、字符、匿名函数等的文字支持

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

    • Java语法冗长且不规则。Clojure语法简洁且规则。由于像
      ->
      doto
      这样的宏,以及像
      proxy
      和(很快)具体化
      这样的构造,即使是用Clojure编写的Java通常也比用Java编写的Java更简洁

    • Java代码有太多的强制性样板文件和无休止的重复
      publicstaticvoidmain(String[]args){…}
      等。Clojure几乎没有这个样板文件,但在表达能力或力量方面几乎没有牺牲。甚至今天的其他静态类型语言似乎也在走类型推断的道路。您有充分的理由需要一个庞大的以Java为中心的IDE来编写和无休止地“重构”Java代码;用手写它会让你发疯,把你的手指累坏

    • 在Java中,任何东西都是一个类或接口,不管它是否应该是,这导致了不必要的复杂性。有许多程序必须被破坏得面目全非,才能适应OOP风格。Clojure允许您避免这种情况。Clojure主要关注动词

    • 通过REPL进行交互式编程很有趣。编译/运行/调试周期不可用。如果需要,Clojure仍然编译为.class文件;同时,你可以坐在代码的中间,在运行时自由地修补。

    • Clojure的元数据和sane平等性测试令人愉快。它的int到long到Bigint的自动升级,有理数的本地处理,等等

    • 与静态类型相比,动态类型导致了更短、更通用、更可重用、更强大的代码。(显然,这是一个极具争议的观点,所以我把它放在最后。)


    • Scala和Groovy、JRuby和Jython以及无数其他非Java的JVM语言的流行应该被视为一个很好的迹象,表明尽管JVM很好,但Java语言对许多人来说是令人不快的。

      Brian对其进行了很好的总结。这是给我留下深刻印象的东西。(摘自斯图尔特·哈洛韦的书)

      J
      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;
          }
      }
      
      (defn blank? [s] (every? #(Character/isWhitespace %) s))