转载

三分钟带你遨游各种JVM语言

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

三分钟带你遨游各种JVM语言

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

1.是否检查异常情况

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

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

三分钟带你遨游各种JVM语言

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

2.非空即真的Elvis操作符

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

三分钟带你遨游各种JVM语言

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<T>作为可选方案,其能够容纳一个可以或不可以包含非null值的对象。因此如果某个值切实存在,isPresent()将返回true而用get()将返回该值。

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

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

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将有机会引入这个机制。

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

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

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

总结

各类JVM语言都拥有自己的独到优势,这也是我们喜爱它们的原因。而在谈到技术社区最大的愿望时,人们显然希望能够将部分Scala特性引入Java当中。

原文链接: https://dzone.com/articles/java-wish-list-the-top-differences-between-java-sc

原文标题:The Top Differences Between Java, Scala, Groovy, Clojure, and Kotlin

原文作者:Henn Idan

文章审核人:回忆的翅膀 译者: 核子可乐

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

原文  http://cloud.51cto.com/art/201701/528497.htm
正文到此结束
Loading...