Clojure在哪些示例中真正针对与并发性/不变性特性无关的Java大放异彩?
我完全明白为什么Clojure真的适合并发编程。在这方面,我也看到了FP的优势 但很明显,我们编写的并非每一行代码都是线程的一部分或需要并发访问。对于代码的这些部分(更简单、更连续的代码),Java真正错过了Clojure提供的是什么 Java中是否真的缺少诸如多方法、动态绑定、解构绑定之类的功能 我想我的问题也可以用以下方式表达:Clojure在哪些示例中真正针对与并发性/不变性特性无关的Java大放异彩?,java,functional-programming,clojure,Java,Functional Programming,Clojure,我完全明白为什么Clojure真的适合并发编程。在这方面,我也看到了FP的优势 但很明显,我们编写的并非每一行代码都是线程的一部分或需要并发访问。对于代码的这些部分(更简单、更连续的代码),Java真正错过了Clojure提供的是什么 Java中是否真的缺少诸如多方法、动态绑定、解构绑定之类的功能 我想我的问题也可以用以下方式表达: 如果Clojure没有 它拥有的并发特性和 整体不变性/易变性 那个么,这个问题不是我们所关心的 Clojure还提供了哪些其他功能 那会让你用它来代替 爪哇 对
- 如果Clojure没有 它拥有的并发特性和 整体不变性/易变性 那个么,这个问题不是我们所关心的 Clojure还提供了哪些其他功能 那会让你用它来代替 爪哇
- 第一类函数。美味的一流功能。这不仅仅是FP的事情。人们叫嚣Java7中的闭包有一个很好的理由
- 代码就是数据。这是任何Lisp的优点。Lisp代码不仅仅是输入到编译器口中的文本块,再也看不见了,它是列表、向量、符号和文字的结构,可以通过编程进行操作。这就产生了强大的宏、一流的符号和许多其他好东西。它产生了一种高度可扩展且功能强大的语言
- Clojure具有更好的控制和循环结构,并且能够通过宏和一流函数创建自己的。Java有
和for
和foreach
而
(而且多年来甚至没有
)。Clojure有foreach
,map
,filter
,reduce
,大量mapcat
表单,大量do
和if
表单,通过when
为
列出理解,等等。如果这些不存在,你可以自己写。在Java中,你需要等待十年,等待一个委员会(也许)批准这些特性
- 除了那些处理静态类型的特性,Clojure的所有特性都已经具备或可能具备。“自动资源管理”,Clojure具有开放式的as
。“对集合的语言支持”,Clojure(以及Ruby、Perl、Python…)已经发布了。“开关中的字符串”,Clojure具有更强大的类似于大小写的结构,如
,以及您能想到的任何其他结构。你可以自己用十几行Clojure来写这些condp
- 列表、映射、数组、集合、排序集、排序映射等的简明语法,以及它们的几乎可互换的使用都要归功于
抽象。对正则表达式、字符、匿名函数等的文字支持seq
- Java有强制检查的异常,这很烦人;Clojure没有
- Java语法冗长且不规则。Clojure语法简洁且规则。由于像
和->
这样的宏,以及像doto
和(很快)具体化proxy
这样的构造,即使是用Clojure编写的Java通常也比用Java编写的Java更简洁
- Java代码有太多的强制性样板文件和无休止的重复
等。Clojure几乎没有这个样板文件,但在表达能力或力量方面几乎没有牺牲。甚至今天的其他静态类型语言似乎也在走类型推断的道路。您有充分的理由需要一个庞大的以Java为中心的IDE来编写和无休止地“重构”Java代码;用手写它会让你发疯,把你的手指累坏publicstaticvoidmain(String[]args){…}
- 在Java中,任何东西都是一个类或接口,不管它是否应该是,这导致了不必要的复杂性。有许多程序必须被破坏得面目全非,才能适应OOP风格。Clojure允许您避免这种情况。Clojure主要关注动词
- 通过REPL进行交互式编程很有趣。编译/运行/调试周期不可用。如果需要,Clojure仍然编译为.class文件;同时,你可以坐在代码的中间,在运行时自由地修补。
- Clojure的元数据和sane平等性测试令人愉快。它的int到long到Bigint的自动升级,有理数的本地处理,等等
- 与静态类型相比,动态类型导致了更短、更通用、更可重用、更强大的代码。(显然,这是一个极具争议的观点,所以我把它放在最后。)
- 对于一个人来说,Clojure的“仪式”通常要少得多。Python和Ruby等语言也比Java具有这一优势(因此JRuby、Jython的流行)
但请注意,在Java中有时无法避免冗长,尽管可能有一个清晰的模式。Clojure的宏在这里是一个巨大的胜利——甚至超过了其他类似的动态语言
另一个需要考虑的问题是Culjule程序趋向于并发安全。因此,如果您决定让某个特定的应用程序并发,这不会太痛苦。如果事先不做很多决定,那么使用Java将非常困难
如果Clojure缺少强大的并发原语和不变性,那么它是否比Java有明显的优势,就像在说:“如果Clojure不是Clojure呢?”
Java中是否真的缺少诸如多方法、动态绑定、解构绑定之类的功能
对。还有
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))