不用抓狂 三分钟带你遨游各种 JVM 语言

简介:

无论您最熟悉的 Java、Scala 还是其它 JVM 语言,总会有更多 JVM 语言不断出现并伴随着各种相关特性。最重要的是,总有一些来自某些语言的、优秀的 “基本” 元素在其它语言中难觅其踪。

image

正因为如此,我们整理出了这样一篇精简的囊括 Groovy、Scala、Clojure、Kotlin 以及 Java 的部分最佳特性的文章。阐述了它们的区别,以帮助你在项目研发里面合理的选择他们。

  1. 是否检查异常情况

Java 中最具争议的特性当属 Checked Exceptions,Checked Exceptions 会在编译时强制执行,同时需要进行某种排序处理。这意味着我们需要在方法中对其进行捕捉或者声明。

虽然部分开发者更倾向于忽略 Checked Exceptions,但这一特性确实能够强制要求大家处理例外情况并借此改善代码质量。因此,虽然其人气不高甚至在一定程度上可以忽略,但必须承认其对于提升编码思路还是有所助益的。

image

Kotlin、Clojure、Groovy以及Scala都不支持Checked Exceptions。

  1. 非空即真的 Elvis 操作符

在这里之所以选择 Elvis 操作符作为讨论对象,是因为其是一种相当便捷的默认值处理方式,且有助于降低重构情况下的错误风险。在它的帮助下,我们无需复制表达式以进行条件与主动返回值测试,从而轻松实现 Null Safety。

image

elvis 这个二元运算操作符会返回第一个为 true 的操作数,否则则返回第二个操作数。Elvis 操作符属于三元运算符的精简版(三元运算符同样可用于 Java),后者本身又是用于将值分配至变量的 if/else 分支表达式的精简版。下面是 Groovy 代码示例:

// Ternary operator - works the same on Java
def ternaryOutput = (sampleText != null) ? sampleText : 'Hello Groovy!'
// The Elvis operator in action. We must read: 'If sampleText is not null assign
// sampleText to elvisOuput, otherwise assign 'Viva Las Vegas!' to elvisOutput.
def elvisOutput = sampleText ?: 'Viva Las Vegas!'

Kotlin 同样使用 Elvis 操作符在 null 引用中实现 null 安全,但必须使用 “?”。如果该操作符左侧的表达式非 null,则 Elvis 会将其返回。否则,其返回该操作符右侧的表达式。整个过程可以简单翻译为以下行:

val l = b?.length ?: -1

Java 并不提供 Elvis 操作符,但其利用类似的方式实现 Null Safety,因此大家需要在处理 null 输入时做好准备。大家可以使用 Optional 作为可选方案,其能够容纳一个可以或不可以包含非 null 值的对象。因此如果某个值切实存在,isPresent() 将返回 true 而用 get() 将返回该值。

同样,Scala 采用类似的 Optional[T] 实现相同效果。其能够容纳符合特定类型的 0 或 1 元素。如果某值缺失,大家会收到具有 None 值的 Some[T]。

  1. 类似弱类型语言的类型推断机制

Kotlin 和 Scala 都引入了一种类型推断机制,允许我们在定义变量的时候不需要指定类型,即整形、字符串、浮点型等等。而由语言本身在运行的时候去决定这个变量是什么类型,下面是基于 Scala 和 Kotlin 定义变量的实例。

var randomVar = 6;
val randomVal = "What should I write here?";
val box = Box(1) // 1 has type Int, so the compiler figures out that we are talking about Box<Int>

因为类型推断机制给我们带来了很多优势,比如不用去记去写很多繁琐的字符,所以甲骨文意识到这点,并且开始向技术社区征求实现局部变量推断的意向调查,这说明在未来,Java 将有机会引入这个机制。

  1. Java 即将引入节约时间成本的 REPL

Clojure、Groovy、Kotlin 以及 Scala 都具有一个节约时间成本的命令行工具 Read-Eval-Print-Loop(简称 REPL)。该工具允许在无需打包为类或者方法的前提下直接运行语句、如果我们需要立即获得反馈,那么这种方法显然更加简便易行。

好消息是,Java 9 即将引入 longtools 软件包,而 REPL 正是其中的组成部分,该工具将允许我们评估声明、语句及表达式,也能够在 JShell 持续读取用户输入内容、评估输入内容并显示输入值或者因输入造成的状态变更说明,进而快速完成代码原型设计。

文章转载自 开源中国社区 [http://www.oschina.net]

目录
相关文章
|
3月前
|
JavaScript 前端开发 Java
深入理解JVM - 动态类型语言
深入理解JVM - 动态类型语言
26 0
|
12月前
|
JavaScript 前端开发 Java
深入理解JVM - 动态类型语言
上一节讲述了栈桢和分派的细节,这一节我们来讲讲自java语言诞生新增加的新语言特性:动态类型语言支持,这一节将会根据动态语言的特性以及相关的介绍同时讲述jvm一个重要的指令:invoke dynamic指令。但是需要注意的是:invokedy namic指令面向 的主要服务对象并非Java语言,而是其他Java虚拟机之上的其他动态类型语言
84 0
|
SQL 存储 NoSQL
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
199 0
|
SQL 存储 NoSQL
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
基于JVM的开源数据处理语言主要有Kotlin、Scala、SPL,下面对三者进行多方面的横向比较,从中找出开发效率最高的数据处理语言。本文的适用场景设定为项目开发中常见的数据处理和业务逻辑,以结构化数据为主,大数据和高性能不作为重点,也不涉及消息流、科学计算等特殊场景。......
193 0
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
|
自然语言处理 算法 Java
为什么java不是最强的语言而JVM确可以叫做最强的虚拟机呢?
为什么java不是最强的语言而JVM确可以叫做最强的虚拟机呢?
为什么java不是最强的语言而JVM确可以叫做最强的虚拟机呢?
|
XML JavaScript 前端开发
可在JVM、nodejs和浏览器运行的静态编译语言 Ceylon 发布 1.0 版
Ceylon是一个可运行于JVM、nodejs和浏览器的静态OO语言。
133 0
可在JVM、nodejs和浏览器运行的静态编译语言 Ceylon 发布 1.0 版
|
JavaScript Java 程序员
牛逼了!教你用九种语言在JVM上输出HelloWorld
为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。
1510 0
|
Java Scala Kotlin
JVM语言生态结构原理图 从Java,Kotlin,Scala,Groovy等语言的编译、执行全过程图示解析
JVM语言生态结构原理图 从Java,Kotlin,Scala,Groovy等语言的编译、执行全过程图示解析 JVM语言生态 by 陈光剑.png
1046 0
JVM语言生态发展简史
JVM语言发展简史 by 陈光剑.png JVM语言生态 by 陈光剑.png
799 0