背景
从定义上来说,Java是面向对象的编程语言,而Scala是函数式编程语言,这两门语言之间,本身也有一定的关联。Scala来源于Java,又“高于”Java,在Java之上增加了一层编码的“API”,让程序员可以通过函数式编程的方式来开发程序。Scala程序最终被编译为.class文件运行在JVM虚拟机中,所以它是JVM下的语言一种,在实际的大数据开发任务当中,Java和Scala都运行于JVM之上,也能更好地集成。本文将对比一下两种编程语言。
Scala
介绍
Scala 是 Scalable Language 的简写,是一门多范式的编程语言,联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel开始设计Scala。Funnel是把函数式编程思想和Petri网相结合的一种编程语言。它一方面继承了多种语言中的优秀特性,一方面又没有抛弃 Java 这个强大的平台,它运行在 Java 虚拟机 (Java Virtual Machine) 之上,轻松实现和丰富的 Java 类库互联互通,并兼容现有的Java程序。它既支持面向对象的编程方式,又支持函数式编程。它写出的程序像动态语言一样简洁,但事实上它确实严格意义上的静态语言,2009年4月,Twitter宣布他们已经把大部分后端程序从Ruby迁移到Scala,其余部分也打算要迁移,此外,Wattzon已经公开宣称,其整个平台都已经是基于Scala基础设施编写的。
应用场景
- 大数据应用:Scala语言开发的Spark可专为大规模数据处理而设计的快速通用的计算引擎,Spark是Scala在大数据领域的应用。
- Web应用:Scala提供面向Web服务,可以和Java等相同的spring Web应用。Play Framework 是使用scala与java开发的一款框架,Play Framework是一个full-stack(全栈的)Java Web的应用框架。
- 分布式应用:Scala 的 Akka (Akka是Scala在JVM平台上构建高并发、分布式和容错应用的工具包)也被不少企业应用于大型分布式应用的开发。
特性
- 面向对象: Scala 是面向对象的编程语言,所有的变量和方法都封装在对象中,可以把信息封装起来供外部使用。
- 函数式编程: Scala 同时又是函数式编程语言,函数可以独立存在,可以定义一个函数作为另一个函数的返回值,也可以接受函数作为函数的参数。这给组合函数带来了很大的便利。如何把面向对象编程形容成搭积木的话,函数式编程就像拼线条,更灵活和更有创意。
- 并发性:Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。
- 一致性: 尽管 Scala 融合了静态类型系统、面向对象、函数式编程等语言特性,但却很少能看出融合的痕迹。Scala 是我见到融合最多语言特性而又不显得杂乱的编程语言之一。
- 类型安全: Scala 创始人是教授,他先带领创建了 Java 5 编译器,而后觉得 Java 有太多羁绊而发明了 Scala。 Scala 编译器和类型系统非常强大,它的目标是尽量把软件错误消灭在编写过程中。Scala 类型系统是图灵完备的,甚至可以在编译期间解决问题。
- 静态类型: Scala 通过编译时的检查,保证代码的安全性和一致性。类型系统具体支持以下特性:泛型类,型变注释(Variance Annotation),类型继承结构的上限和下限,把类别和抽象类型作为对象成员,复合类型,引用自己时显式指定类型,视图,多态方法。
- 异步编程: 由于函数式编程提倡变量不可变,使异步编程变得非常容易。同时 Scala 提供的 Future, 和 akka 类库,使得异步编程变得非常容易。
- 基于 JVM: Scala 会被编译成为 jvm bytecode,支持无缝集成已有的 Java 类库。你可以非常自然地使用已经存在的非常庞大且稳定的 Java 类库,比如小巧好用的 apache.common.*, 或者 Java 上的各种工具类库。
- 因为如此众多特性,用 Scala 可以优雅地编写简洁的代码,同时又能减少很多低级错误;能快速进行开发,又能保证系统性能、团队协作和长期维护。
- 扩展性:Scala的设计秉承一项事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构
生态
- web框架:有许多 Scala 框架可用于快速轻松地开发 Web 应用程序,例如Play、Lift、Scalatra等等
- 分布式应用:可应用Akka、Finagle进行高并发、分布式的应用
- 构建工具:SBT、maven、gradle等
- 大数据应用:Scala语言开发的Spark可专为大规模数据处理而设计的快速通用的计算引擎
- 开发工具:IntelliJ、eclipse、netbeans、Sublime text 、Activator等
java
介绍
Java是一种通用的,基于类的,面向对象的编程语言。它是用于应用程序开发的计算平台。因此,Java是快速,安全和可靠的。它被广泛用于在笔记本电脑,数据中心,游戏机,科学超级计算机,手机等中开发Java应用程序。Java遵循WORA(Write Once, Run Anywhere。一次写入,到处运行)的原理,并且与平台无关。它也简单易学。Java最初由Sun Microsystems在1990年代开发,用于开发从Web应用程序到移动应用程序到批处理应用程序的所有内容。Java最初是一种纯粹的面向对象的语言,但现在已经发展成为一种多范例语言,可以高度适应任何情况。拥有庞大的开发人员社区和支持库,Java是开发几乎所有类型的应用程序的理想选择。
应用场景
- 桌面应用: 桌面应用程序可以使用Java轻松开发。我们使用AWT,Swing,JavaFX等API来构建这些应用程序。软件工具是开发人员用来开发,分析,维护,调试或支持其他应用程序和程序的一组计算机程序。许多开发人员使用Java编写和开发有用的软件工具。比如Eclipse,IntelliJ Idea和NetBeans IDE。
- 移动应用:移动应用程序是为手机和平板电脑创建的应用程序。在当今时代,大多数电话和智能设备都具有Android操作系统,没有Java就不可能进行Android开发。Java Micro Edition(Java ME或J2ME)是一种流行的跨平台框架,用于构建可在所有功能手机和智能手机上运行的应用程序。Java被证明是开发二维游戏的最佳平台之一。如今,几乎每个人都拥有装有Android游戏的Android手机。没有Java,就无法构建Android游戏。
- 企业应用:企业应用程序是一个大型软件系统,可以在公司环境中运行,以满足组织而不是单个用户的需求。
- 科学应用:科学应用程序是一种使用数学影响实际活动的应用程序。Java由于其强大的功能而支持科学应用程序的开发。
- Web应用:Web应用程序是通过浏览器界面在Internet上交付的客户端-服务器程序。Web服务器是一种计算机程序,它使用HTTP(超文本传输协议)和其他协议来存储,处理和响应通过WWW(万维网)发出的客户端请求。Web服务器是运行网站并向用户交付网页的系统。Java生态系统包含多个Java Web服务器和应用程序服务器。Java提供了Web服务器,包括Apache Tomcat,Simple,Jo!,Rimfaxe Web服务器(RWS)Apache HTTP服务器,Resin,Adobe JRun和Project Jigsaw。
- 嵌入式系统:一个嵌入式系统,也被称为集成系统,是组装在一起以执行专用功能的更大的系统的许多小的计算单元的组合。嵌入式系统随处可见。例如,电机系统,汽车中的娱乐和多媒体,电子商务,无线通信,移动计算和联网都使用嵌入式系统。嵌入式系统使用Java进行开发。最初,Java是为开发嵌入式系统而设计的。
- 大数据技术:大数据一词定义为“可以分析以提取模式,趋势和有用信息的极大型和复杂数据集。它是最新技术领域中最受欢迎的主题之一。Java是大数据的视角。如今,许多开发人员正在将职业转向大数据技术。
- 分布式应用:分布式应用程序是在网络内的多台计算机上执行或运行的应用程序或软件。分布式应用程序或系统具有许多共同的要求,尤其是由于它们在其上运行的平台的分布式和动态特性而产生。Java提供了实现这些应用程序的选项。
- 云应用:云计算意味着通过Internet按需交付IT资源,包括具有按需付费定价模式的存储,服务器,数据库,网络和软件。它可以低成本为IT基础架构提供解决方案,因为我们可以将文件保存在远程数据库中并按需检索它们。长期以来,Java一直是为Web应用程序提供结构的编程语言,由于它的分布式特性,现在它已经进入了云应用程序。
特性
- 面向对象:按照对象集合的方式组织程序是一种面向对象的编程思维。面向对象编程的四个主要概念是:抽象化,封装,继承,多态。
- 平台无关:它提供了在不同平台下的解释运行环境
- 简单性:Java是简单的语言之一,吸收了C/C++语言的优点,因此它不具有指针,运算符重载,多重继承,显式内存分配等复杂功能
- 安全性:自动回收垃圾,强制类型检查,取消指针
- 分布式:我们可以使用Java编程语言创建分布式应用程序。远程方法调用和企业Java Bean用于在Java中创建分布式应用程序。Java程序可以轻松地分布在通过Internet连接相互连接的一个或多个系统上。
- 多线程:Java支持多线程。它是Java的一项功能,它允许并发执行程序的两个或更多部分,以最大程度地利用CPU。
- 可移植:Java的平台无关功能,其中可以将其平台无关字节码带到任何平台上执行,从而使Java可移植。
- 安全性:Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制
- 健壮性:Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。
生态
- java版本:java 7以及更早的版本、java 8、java9、java10、java11、java12 、java13,截止目前已经发布到java16,Java 每 6 个月定期发布新版本
- java 框架:spring、Hibernate、OpenJPA、JSP、JSF、FreeMarker、dropWizard、Quarkus、Micronaut、Vert.X,其中spring 市场份额最大
- web服务器:Tomcat、websphere、weblogic、jboss、Jetty等,Tomcat 仍然是最热门的应用服务器
- 前端技术:html、jquery、angularjs、vue、javascrite、css等
- 开发工具:IntelliJ、eclipse、netbeans等,IDE领域, IntelliJ 占有绝对地位
- 构建工具:ant、maven、gradle等
- 数据库:mysql、oracle、sql server、postgresql等以及一些NoSQL数据库,MySQL非常稳健,PostgreSQL增长迅速
- 其它jvm语言:Kotlin、Groovy、Scala、Not Yet等等
总结
虽然 Java 语言的简单性是其成功的一部分,但具有讽刺意味的是,它也导致了其复杂性。当然,您几乎可以用 Java 编写任何东西,但这样做所需的代码行数可能令人生畏。另一方面,Scala 中的编程结构稍微复杂一些,但是相对于Java而言,Scala的代码更为精简(减低犯错),而且功能更为广泛(Scala其实是Scalable Language 的简称,意为可扩展的语言),许多Scala的特性和语法都是针对Java的不足和弱点来设计的。
Scala 与 Java 语法上的明显差异有:
- 变量声明:Scala 支持自动类型推断(var 变量;val 常量)。Scala 更多的是采用常量,而不是变量来解决问题,这样带来的好处是可以减少多线程并发安全问题,特别适合高并发分布式的场景。
- 函数的声明:Scala 函数没有返回值时使用 Unit,相当于 Java 的 void。Scala 支持函数式编程,可以使用高阶函数。
- 基本类型:Scala 中没有真正意义上的基本类型,类型都是类。
- 静态:Java 中静态 static 是违背 Java OOP 编程思想和封装特性。Scala 取消了静态的概念,使用了单例对象 Object 来实现。
- 字符串:Scala 支持使用字符串插值的方式对字符串进行格式化,使用 $ 开头进行取值。另外支持使用三引号将其中的内容直接包起来,其中可以包括任何字符,而不需要进行特别转义。
- 类:Scala 类中的字段自动带有 getter 和 setter 方法,另外可以使用 @BeanProperty 注解来生成 Java 中的Get/Set 方法。Scala 中的每个类都有一个主构造方法,这个构造方法和类定义 “交织在一起”,类的参数直接成为类的字段,主构造方法执行类体中的所有语句。
- Scala中不支持break使用 return 替代。在循环中使用 if 和布尔类型变量。导入 Java 中支持 break 的包。
- 访问范围:Java 中外部看不到内部,内部能看到外部。Scala 中外部看不到内部,内部也看不到外部。
- 通配符:Java 中使用 * 进行通配。Scala 中使用 _ 进行通配。
- 默认导入的类:Scala 默认 java.lang 包、Scala 包、Scala.Predef 类。Java 默认导入 java.lang 包。
- 特质 trait 可以类比 Java 中的接口,但是和接口非常不一样Java 中称为类实现了接口,Scala 中称为混入了特质。和 Java 中的接口不同,Scala 中的特质可以包含带有方法体的方法(JDK8 接口也可以的,比如 default 方法)。