龙空技术网

如果一定要替换Java,你会选择Kotlin还是Scala!

IT168企业级 793

前言:

当前大家对“scala和java”可能比较关切,同学们都需要了解一些“scala和java”的相关资讯。那么小编在网摘上收集了一些关于“scala和java””的相关资讯,希望姐妹们能喜欢,我们快快来学习一下吧!

自从有消息称,Kotlin是Android官方正式支持的语言,很多移动开发者就对该语言是否可取代Java以及是否应该切换到Kotlin有了疑问,本文将对此进行解答。但要注意,如果你正在考虑放弃Java,就应该知道Kotlin不是唯一的选择。

本文,我们将考察Kotlin和Scala之间的所有区别,介绍二者之间的差异,例如它们与Java的兼容性和社区支持水平,然后深入到两者技术语言层面的差异。

注意:尽管本文针对的是正在考虑从Java转移的开发人员,但还包含了许多有助于Scala开发人员的信息,Scala开发者或许也想知道Kotlin是否有提供某些功能呢。

替代Java,你希望是具备什么功能的编程语言?

虽然Scala和Kotlin都被广泛认为是Java替代品,但二者有非常不同的改进。Kotlin旨在通过减少样板代码并引入Java缺乏的功能来成为更好的替代品。

相比之下,Scala的设计十分不同,Sacla受函数式编程概念的影响更大,因此其语法更灵活。虽然Java 8已经引入了许多函数编程功能,但Scala仍然是非常必要的语言。如果你喜欢Java是因为其很棒的可移植性,Scala正好满足这一点,同时以更有函数式的风格进行编码。Scala面向对象和函数式编程的混合风格也使得它非常适合想组合这两种编程风格的项目。

此外,Scala还包括一些Kotlin或Java缺少的功能,例如完全支持模式匹配,宏和更高级的类型,这使得Scala非常适合处理大数据任务,如:图形分析,聚合计算和复杂的数学建模(例如医学建模),如果你是经常处理大型数据集的数据科学家,那么可能会发现Scala更高级的功能,比如并发支持以及与数据处理引擎Apache Spark的紧密关系。

上述分析不难看出,Kotlin旨在成为升级版Java,而Scala完全是另一种语言。如果你对Java的冗长度感到沮丧,那么Kotlin可能是你需要的。如果厌倦了Java的功能集和限制,切换到Scala可能更有意义。

每种编程语言的学习周期大概是多久?

由于Scala功能强大,具有许多高级功能和灵活的语法,所以这并不是一门简单易学的编程语言,并且可能对初学者构成威胁。相比之下,Java开发人员切换到Kotlin之后,都会赞扬其学习的容易程度。一些企业报告指出,他们的Java开发人员能够在短短几个小时内掌握基本的Kolin语法,并在开始大约一到三天之内写出代码。

不过,如果仅仅是容易学习,Kotlin不可能被广泛认可。Kotlin对Java的兼容性和互操作性也是非常好的。

从一种语言切换到另一种语言不可避免出现遗留代码,你可能需要继续支持当前Java项目。Scala和Kotlin都可以与Java互操作。但是,如果情况要求与现有Java技术或项目保持完全兼容,则Kotlin具有明显优势,因为它可以与Java100%互操作。开发人员可以轻松地从Java中调用Kotlin代码,并从Kotlin中获取Java代码。如果要使用Kotlin进行服务器端开发,可以使用现有的基于Java的框架,例如Java Server Faces(JSF)或反应式Web应用程序“Vert.x”框架。

虽然应该没有从Scala代码访问Java类的问题,但如果你使用某些Scala高级功能,则尝试从Java调用Scala类时可能会遇到问题,因为这些功能通常不具有Java等效项。

资源和社区支持

JetBrains在2011年推出Kotlin,Scala在2004年首次公开露面。

这两种语言都有完整的文档,但作为一种较新的语言,Kotlin在本地库,博客文章和教程方面的社区资源要少得多。事实上,在Stack Overflow网站上,开发人员会发现3.8K标记为Kotlin的问题,而超过68.5K的Scala问题。

但是,Kotlin在Android中得到了正式的支持。

目前,在Android Studio 3.0 预览版本和更高版本中,使用Kotlin支持创建项目就像在项目创建向导中选择复选框一样简单。此外,还有一些功能使Kotlin特别适合Android开发:

扩展功能:这是向现有类添加新功能的位置。在Android应用程序中,扩展功能对于ViewGroups特别有用。

Kotlin Android扩展:此功能允许将视图的引用导入到活动中,这有可能使所有findViewById样板代码成为过去。

虽然SBT的Android SDK插件确实存在,但它需手动添加到开发环境中,Android Studio并没有正式支持。

Null问题与运算符

现在进入语言层面的差异。Scala和Kotlin之间的区别之一是处理null的方式不同。

绝大多数Java开发人员非常熟悉NullPointerExceptions(NPE)。虽然Java 8的@NonNull注释确实有助于减轻NPE所造成的一些痛苦,但null仍是Java开发人员的一大痛点。

Scala对null采用monadic方法,通过用Option替换空值。Option可以不包含任何值(None)或单个值,它表示为Some[value of the correct type]。

我们假设你有一个从数据库返回地址的方法:

def findAddress(key:Int):Option [Address]

如果找到记录,那么将返回[Address]。如果没找到,它将返回None。

这种方法的缺点是会增加代码复杂性,因为需要明确使用Option。另外,Scala中仍然存在null,因为val x:Option [Int] = null完全有效。在另一方面,可以将其他方法应用于Option值,从而更灵活地处理潜在Null值。

相反,Kotlin拒绝编译分配或返回空值的代码。例如,以下将不会被编译:

val name: String = null

john getName() : String = null

这不会增加代码的复杂性,并且几乎不可能在Kotlin中遇到NPE,尽管仍然可能遇到来自外部Java代码的NPE。

操作符重载

操作符重载是重定义特定类型操作符行为的地方,虽然在Java中找不到此功能(尽管Java处理+ for Strings确实非常接近),但Scala和Kotlin都支持操作符重载。

与Kotlin相比,Scala对操作符重载采取了更为宽松的做法。它可以定义几乎无限制的运算符查找功能,灵活的运算符重载使代码更加人性化:a + b比a.plus(b)更易读。

此功能还使Scala非常适合设计内部域特定语言(如果想设计外部DSL,需要强大的解析器组合库)。然而,使用不当,操作符重载会导致代码难以破解,特别是初学者。

Kotlin尝试通过允许重载已经在语言(+, - 等)中的基本操作符,阻止定义新的操作,从而在权限和可读性之间取得平衡。在Kotlin中,可以通过实现相应的标准函数来定义一个运算符,并用关键字“operator”注释。

这些限制意味着大多数Kotlin运营商都很容易理解,即使是刚开始使用Kotlin的开发人员。 缺点是不够灵活。

内联

内联是一种优化,可以通过使用实际的功能代码替换函数调用站点来消除调用开销。内联函数的运行速度比普通函数要快,这样就可以构建一个很好的例子,说明如何对代码进行调整以提高性能。

Java编译器将自动执行内联,但Java并不提供手动内联函数的方法,如果切换到Scala或Kotlin将获得手动内联函数的功能。

在Scala中,可以要求编译器尝试使用@inline来注释内联方法,例如:

@inline final def f1(x: Int) = x

在Kotlin中,使用'inline'关键字,但请注意,大量使用“inline”关键字可能导致代码失去控制。与Scala相比,需要更加注意在Kotlin中使用手动内联的位置,特别应该避免内嵌在代码中多个位置使用的大型函数。

Data Classes

Scala和Kotlin数据类具有类似功能,使用“case”(Scala)或“data”(Kotlin))关键字标注常规类来触发自动生成与数据模型对象(包括toString,equal和hashCode)以及访问器方法和设置器相关联的大部分样板代码。

然而,一个显著区别是Kotlin不自动推断构造函数参数,所以需要人为声明为val或var。例如,以下是Scala案例类示例:

case class Date(month: String, day: Int)

但是Kotlin的将是:

data class Date(var month:String, var day: Int)

结论

如果对Java提供的功能非常满意,但不想编写大量样板代码,Kotlin是不错的。如果厌倦了Java本身,并渴望更先进和强大的功能,并且正在使用大数据,那么Scala才应该是你的选择。

标签: #scala和java