返回顶部
首页 > 资讯 > 精选 >Java中Groovy、Scala和Clojure的共同点是什么
  • 289
分享到

Java中Groovy、Scala和Clojure的共同点是什么

2023-06-17 08:06:26 289人浏览 独家记忆
摘要

Java中Groovy、Scala和Clojure的共同点是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 编程语言诞生时所面临的限制与如今的开发人员所面临的条

Java中Groovy、Scala和Clojure的共同点是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Java 编程语言诞生时所面临的限制与如今的开发人员所面临的条件有所不同。具体来讲,由于上世纪 90  年代中期的硬件的性能和内存限制,Java 语言中存在原语类型。从那时起,Java  语言不断在演化,通过自动装箱(autobox)消除了许多麻烦操作,而下一代语言(Groovy、Scala 和  Clojure)更进一步,消除了每种语言中的不一致性和冲突。

在这一期的文章中,我将展示下一代语言如何消除一些常见的 Java 限制,无论是语法上还是默认行为上。***个限制是原语数据类型的存在。

原语的消亡

Java 语言最开始有 8 对原语和相应的类型包装器类(最初用于解决性能和内存限制),并通过自动装箱逐步地淡化了它们之间的区别。Java 下一代语言更进一步,让开发人员觉得好像根本不存在差别。

Groovy 完全隐藏了原语类型。例如,int 始终表示 Integer,Groovy 自动处理数字类型的上变换,防止出现数值溢出错误。例如,请查看清单 1 中的 Groovy shell 交互:

清单 1. Groovy 对原语的自动处理

groovy:000> 1.class ===> class java.lang.Integer groovy:000> 1e12.class ===> class java.math.BigDecimal

在清单 1 中,Groovy shell 显示,即使是常量也是通过底层的类来表示的。因为所有数字(和其他伪装的原语)都是真正的类,所以可以使用元编程技术。这些技术包括将方法添加到数字中(这通常用于构建特定领域的语言,即 DSL),支持 3.cm 这样的表达式。在后面介绍可扩展性的那期文章中,我会更全面地介绍此功能。

与 Groovy 中一样,Clojure 自动屏蔽原语与包装器之间的区别,允许对所有类型执行方法调用,自动处理容量的类型转换。Clojure 封装了大量底层优化,这已在语言文档中详细说明(参阅 参考资料)。在许多情况下,可提供类型 hints,使编译器能够生成更快的代码。例如,无需使用 (defn sum[x] ... ) 定义方法,可以添加一个类型提示,比如 (defn sum[^float x] ... ),它会为临界区 (critical section) 生成更高效的代码。

Scala 也屏蔽了原语之间的区别,通常对代码的时效性部件使用底层原语。它还允许在常量上调用方法,就像 2.toString 中一样。借助其混搭原语和包装器的能力,比如 Integer,Scala 比 Java 自动装箱更加透明。例如,Scala 中的 == 运算符可在原语和对象引用上正确运行(比较值,而不是引用),而不同于相同运算符的 Java 版本。Scala 还包含一个 eq 方法(以及一个对称的 ne 方法),它始终比较底层引用类型是否等效。基本而言,Scala 会智能地切换默认行为。在 Java 语言中,== 会对引用数据进行比较,您几乎不需要这么做,可以使用不太直观的 equals() 比较值。在 Scala 中,== 能正确运行(比较值),无论底层实现是什么,它还提供了一个方法来执行不太常见的引用相等性检查 (reference equality check)。

Scala 的这一特性表明,Java 下一代语言的一个重要优势在于:将低级细节卸载到语言和运行时,开发人员能够有更多的时间考虑更高级的问题。

简化默认行为

人们的看法高度一致,大部分 Java 开发人员都认为,在 Java 语言中常见的操作需要太多的语法。例如,属性定义和其他样板代码使类定义变得很杂乱,掩盖了重要的方法。所有 Java 下一代语言都提供了简化创建和访问过程的途径。

Scala 中的类和 case 类

Scala 已简化了类定义,可为您自动创建存取函数、赋值函数和构造函数。例如,请查看清单 2 中的 Java 类:

清单 2. Java 中简单的 Person

class Person {     private String name;     private int age;      Person(String name, int age) {         this.name = name;         this.age = age;     }      public String getName() {         return name;     }      public int getAge() {         return age;     }      public void setAge(int age) {         this.age = age;     }      @Override     public String toString() {         return name + " is " + age + " years old.";     } }

清单 2 中惟一的非样板代码是改写的 toString() 方法。构造函数和所有方法都由 IDE 生成。相比快速生成代码,在以后轻松理解它更为重要。无用的语法增加了您在理解底层含义之前必须使用的代码量。

Scala Person 类

令人震惊的是,清单 3 中用 Scala 编写的简单 3 行定义就创建了一个等效的类:

清单 3. Scala 中的等效类

class Person(val name: String, var age: Int) {   override def toString = name + " is " + age + " years old." }

清单 3 中的 Person 类浓缩成了一个可变的 age 属性、一个不可变的 name 属性,以及一个包含两个参数的构造函数,还有我改写的 toString() 方法。很容易看到这个类的独特之处,因为有趣的部分没有埋藏在语法中。

Scala 的设计强调了以最少的语法创建代码的能力,它使许多语法成为可选语法。清单 4 中的简单类演示了一个将字符串更改为大写字母的 Verbose 类:

清单 4. Verbose 类

class UpperVerbose {   def upper(strings: String*) : Seq[String] = {     strings.map((s:String) => s.toUpperCase())   } }

清单 4 中的许多代码都是可选的。清单 5 给出了相同的代码,现在使用了一个 object 而不是 class

清单 5. 一个转换为大写的更简单的对象

object Up {   def upper(strings: String*) = strings.map(_.toUpperCase()) }

对于等效于 Java 静态方法的 Scala 代码,可创建一个 object(与独体实例等效的 Scala 内置实体)而不是一个类。方法的返回类型、用于将单行方法主体分开的括号,以及 清单 4 中无用的 s 参数都从清单 5 中消失了。Scala 中的这种 “可折叠语法” 有利有弊。使用可折叠语法,能够以非常符合语言习惯的方式编写代码,但这让不熟悉的人难以理解您的代码。

case 类

用作数据持有者的简单类在面向对象的系统中很常见,尤其是必须与不同系统通信的系统。这种类型的类的流行使得 Scala 项目向前推进了一步,创造了 case 类。case 类自动提供了多种便捷的语法:

  • 可根据该类的名称创建一个工厂方法。例如,可以在不使用 new 关键字的情况下构造一个新实例:val bob = Person("Bob", 42)

  • 该类的参数列表中的所有参数都自动 val,也就是说,它们是作为不可变的内部字段来维护的。

  • 编译器为您的类生成合理的默认 equals()hashCode()toString() 方法。

  • 编译器将一个 copy() 方法添加到类中,以便您可返回某个副本来执行变体式更改。

Java 下一代语言不仅修复了语法瑕疵,还促进了对现代软件工作原理的更准确的理解,朝这个方向塑造它们的工具

Groovy 的自动生成属性

在 Java 下一代语言中,Groovy 与 Java 语法最接近,为常见情形提供了称为 “语法糖 (syntactic-sugar)” 的代码生成方法。参见清单 6 中简单的 Groovy Person 类:

清单 6. Groovy Person

class Person {   private name   def age    def getName() {     name   }    @Override   String toString() {     "${name} is ${age} years old."   } }  def bob = new Person(name: "Bob", age:42)  println(bob.name)

在 清单 6 的 Groovy 代码中,定义一个字段 def 会得到一个存取函数和赋值函数。如果仅喜欢其中一个函数,可自行定义它,就像我对 name 属性所做的那样。尽管该方法名为 getName(),但我仍然可以通过更直观的 bob.name 语法访问它。

如果希望 Groovy 自动为您生成 equals()hashCode() 方法对,可以向类中添加 @EqualsAndHashCode 注释。该注释使用 Groovy 的抽象语法树 (Abstract Syntax Tree, AST) 转换 生成基于您的属性的方法(参阅 参考资料)。在默认情况下,此注释仅考虑属性(而不考虑字段);如果添加了 includeFields=true 修饰符,它也会考虑字段。

Clojure 的映射式记录

可在 Clojure 中像其他语言中一样创建相同 Person 类,但这并不符合语言习惯。传统上,Clojure 等语言依靠映射(名称-值对)数据结构来持有这种类型的信息,并使用了一些处理该结构的函数。尽管仍然可以在映射中建模结构化的数据,但目前更常见的情形是使用记录。记录是 Clojure 对具有属性(常常是嵌套的)的类型名的更加正式的封装,每个实例具有相同的语义含义。(Clojure 中的记录就像类 C 语言中的 struct。)

例如,请考虑以下人员定义:

(def mario {:fname "Mario"             :age "18"})

鉴于此结构,可以通过 (get mario :age) 访问 age。简单的访问是映射上的一个常见操作。借助 Clojure,可以利用使用键充当着映射上的存取函数 的语法糖,以便使用更有效的 (:age mario) 速记法。Clojure 期望对映射进行操作,所以它提供了大量语法糖来简化此操作。

Clojure 还拥有访问嵌套的映射元素的语法糖,如清单 7 所示:

清单 7. Clojure 的速记式访问

(def hal {:fname "hal"           :age "17"           :address {:street "Enfield Tennis Academy"                     :city "Boston"                     :state "MA"}})  (println (:fname hal)) (println (:city (:address hal))) (println (-> hal :address :city))

在 清单 7 中,我定义了一个名为 hal 的嵌套数据结构。对外部元素的访问按预期进行 ((:fname hal))。如 清单 7 中倒数第二行所示,Lisp 语法执行 “内外” 评估。首先,必须从 hal 获取 address 记录,然后访问 city 字段。因为 “内外” 评估是一种常见用法,所以 Clojure 提供了一个特殊运算符(-> thread 运算符)来反转表达式,使它们更加自然、更具可读性:(-> hal :address :city)

可使用记录创建等效的结构,如清单 8 所示:

清单 8. 使用记录创建结构

(defrecord Person [fname lname address]) (defrecord Address [street city state]) (def don (Person. "Don" "Gately"             (Address. "Ennet House" "Boston", "MA")))  (println (:fname don)) (println (-> don :address :city))

在 清单 8 中,我使用 defrecord 创建了相同的结构,得到了一种更加传统的类结构。借助 Clojure,可以通过熟悉的映射操作和方言在记录结构中实现同样便捷的访问。

Clojure 1.2 围绕常见操作的记录定义通过两个工厂函数添加了语法糖:

  • ->类型名称, 接收字段的位置参数

  • ->映射->类型名称, 字段值的关键字映射

使用符合语言习惯的函数,代码由清单8 转换成版本清单 9.

清单 9. Clojure 的漂亮的语法糖

(def don (->Person "Don" "Gately"    (->Address "Ennet House" "Boston", "MA")))

在许多情况下,记录比映射和扁平结构更受欢迎。首先,defrecord 创建了一个 Java 类,使它更容易在多方法定义中使用。然后,defrecord 指定更多任务,在您定义记录时启用字段验证和其他细微处理。第三,记录速度快得多,尤其在您拥有一组固定的已知键的时候。

Clojure 结合使用记录和协议来构造代码。未来的一期文章将介绍它们的关系。

结束语

与 Java 语言相比,所有 3 种 Java 下一代语言都提供了更便捷的语法。Groovy 和 Scala 使构建类和常见情形更加轻松,而  Clojure 使映射、记录和类能够无缝地互操作。所有 Java  下一代语言的一个共同主旨是消除不必要的样板代码。在下一期文章中,我将继续探讨这个主题并讨论一些异常。

关于Java中Groovy、Scala和Clojure的共同点是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: Java中Groovy、Scala和Clojure的共同点是什么

本文链接: https://www.lsjlt.com/news/287898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中Groovy、Scala和Clojure的共同点是什么
    Java中Groovy、Scala和Clojure的共同点是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 编程语言诞生时所面临的限制与如今的开发人员所面临的条...
    99+
    2023-06-17
  • Groovy、Scala和Clojure共性是什么
    本篇内容主要讲解“Groovy、Scala和Clojure共性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Groovy、Scala和Clojure共性是什么”吧!Java 编程语言诞生时...
    99+
    2023-06-17
  • java中groovy调用的方法是什么
    在Java中调用Groovy方法,可以使用GroovyShell类来执行Groovy代码。具体步骤如下: 创建GroovyShel...
    99+
    2024-03-11
    java
  • java中抽象类和接口的相同和不同点是什么
    这篇文章将为大家详细讲解有关java中抽象类和接口的相同和不同点是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言下面简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例。一、抽象...
    99+
    2023-06-22
  • ASP、NumPy和NPM:有什么共同点?
    ASP、NumPy和NPM都是技术领域中的缩写词,分别代表着不同的技术工具。虽然它们用途和功能各不相同,但它们都是优秀的技术工具,可以为开发者们提供便利和帮助。 ASP ASP的全称是Active Server Pages,是一种基于服务...
    99+
    2023-09-23
    numy 学习笔记 npm
  • JVM中Java和Scala并发性基础是什么
    本篇文章给大家分享的是有关JVM中Java和Scala并发性基础是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。处理器速度数十年来一直持续快速发展,并在世纪交替之际走到了终...
    99+
    2023-06-17
  • “Laravel和Numpy:它们有什么共同点?”
    Laravel和Numpy:它们有什么共同点? Laravel和Numpy是两个完全不同的技术。Laravel是一个PHP框架,而Numpy是一个Python库。然而,这两个技术有一个共同点,那就是它们都是为了让开发人员更加高效地处理数据而...
    99+
    2023-09-08
    npm laravel numpy
  • Java和JavaScript有什么相同点和不同点?
    Java和JavaScript是两种非常常见的编程语言,它们在开发应用程序和网站方面都有着广泛的应用。虽然它们的名字很相似,但它们有着不同的用途和特点。本文将探讨Java和JavaScript之间的相同点和不同点。 一、相同点 编程语言 ...
    99+
    2023-08-26
    javascript 数据类型 关键字
  • Java8和Scala中的Lambda表达式有什么不同
    本篇内容介绍了“Java8和Scala中的Lambda表达式有什么不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、为什么使用Lambd...
    99+
    2023-06-17
  • java中groovy性能调试的方法是什么
    在Java中调试Groovy性能的方法与调试Java性能的方法类似,以下是一些常用的方法: 使用性能分析工具:可以使用一些性能分...
    99+
    2024-03-11
    java
  • 日志记录在 Bash 和 Java 中的异同点是什么?
    日志记录是软件开发中非常重要的一个环节,可以帮助开发者在软件运行时快速定位和解决问题。在 Bash 和 Java 中,日志记录也是非常常见的操作。本文将从以下几个方面探讨 Bash 和 Java 中日志记录的异同点。 日志记录的目的 B...
    99+
    2023-10-12
    bash 并发 日志
  • 台湾服务器和香港服务器的共同点是什么
    台湾服务器和香港服务器的共同点是:1、它们都位于亚洲地区,提供互联网服务,并面向当地和海外用户。 2、它们都拥有良好的网络基础设施和...
    99+
    2024-04-09
    香港服务器 服务器
  • 你知道Java和Unix之间的共同点吗?
    Java和Unix都是计算机领域中非常重要的技术,它们在各自的领域内发挥着重要的作用。虽然它们两者看起来似乎没有什么联系,但是实际上Java和Unix之间存在着一些共同点。本文将会深入探讨这些共同点,并且穿插演示代码来让读者更好的理解。 一...
    99+
    2023-09-10
    unix 分布式 javascript
  • Java动态脚本Groovy的特性是什么
    这篇文章主要为大家展示了“Java动态脚本Groovy的特性是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java动态脚本Groovy的特性是什么”这篇文章吧。1.Groovy特性可将ja...
    99+
    2023-06-22
  • 异步编程:Python、Unix、JavaScript之间的差异和共同点是什么?
    异步编程是一种编程模型,它可以在程序执行其他任务的同时,处理多个并发的异步操作。Python、Unix和JavaScript都支持异步编程,但它们之间存在着差异和共同点。本文将探讨Python、Unix和JavaScript之间异步编程的差...
    99+
    2023-06-18
    unix javascript 异步编程
  • 香港云主机具有的共同特点是什么
    香港云主机具有的共同特点:1. 香港云主机的服务器放置在香港的机房,对国内的访问速度较快。2. 香港云主机在稳定性都很高,有利于搜索引擎蜘蛛对网站进行抓取,提高用户体验。3.香港云主机都会提供中文官网及中文客服,7*24小时在线服务,及时解...
    99+
    2024-04-02
  • link和@import的异同点是什么
    这篇文章主要讲解了“link和@import的异同点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“link和@import的异同点是什么”吧!页面中使用CSS的方式主要有3种:行内添加...
    99+
    2023-06-08
  • MySQL和Oracle的相同点是什么
    MySQL和Oracle都是关系型数据库管理系统,具有以下相同点: 数据存储和管理:MySQL和Oracle都能够存储和管理大量...
    99+
    2024-04-09
    MySQL Oracle
  • ASP.NET和XML Web Services共同特性是什么
    本篇内容主要讲解“ASP.NET和XML Web Services共同特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET和XML Web Services共同特性是什么”吧!...
    99+
    2023-06-17
  • nGrinder中groovy的脚本结构是什么
    这篇文章跟大家分析一下“nGrinder中groovy的脚本结构是什么”。内容详细易懂,对“nGrinder中groovy的脚本结构是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作