<!----><!---->
2. <!---->一种类似 Java 的语言
Scala 被设计成为可以与主流平台很好的交互,包括 Java 和 C# 。因此其绝大部分的基本操作符、数据类型和控制逻辑都与这两种语言相同。为简单起见,后面我们仅将 Scala 与 Java 作对比,由于 Java 与 C# 本身就有很多共同点,因此 Scala 绝大部分与 Java 的相似之处都可直接应用于 C# 。其实有些情况下 Scala 甚至更接近 C# ,例如对泛型的处理方面。
表 1 列出了 Java 和 Scala 实现同样功能的两段程序,都是打印出程序命令行包含的所有选项。
<!----><!----><!---->
// Java
class PrintOptions {
public static void main(String[] args) {
System.out.println("Options selected:");
for (int i = 0; i < args.length; i++)
if (args[i].startsWith("-"))
System.out.println(" " + args[i].substring(1));
}
}
// Scala
object PrintOptions {
def main(args: Array[String]): Unit = {
System.out.println("Options selected:");
for (val arg<-args)
if (arg.startsWith("-"))
System.out.println(" "+arg.substring(1))
}
}
|
表 1 : Scala 与 Java 程序示例
这个示例显示出两种语言很多相似性:他们都有 String 这种基本类,调用同名的方法,使用同样的操作符、同样的条件控制结构等。示例同时也体现两种语言的差异,包括:
- <!---->Scala 除类定义之外,还有对象定义的概念(以 Object 开头)。对象定义实际上是定义了一个只有单个实例的类,也就是通常所说的单例( singleton )。在上例中, PrintOptions 这个单例类有一个名为 main 的成员方法。
- <!---->Scala 采用“名称:类型”的方式进行变量定义和参数传递,而 Java 是使用类型前缀的形式,也就是“类型 名称”。
- <!----><!---->Scala 的语法比 Java 的相对更规范:所有的定义都由一个关键字开始,如上例中的 def main ,开始定义一个方法。
- <!---->Scala 不强制要求语句结束使用分号,分号是可选的。(原文中 Java 语句也没有分号,明显是错漏; Scala 两个语句都没有分号,我特意加了一个,更体现原意,当然是确保编译和运行正确的情况下——译注)
- <!---->Scala 没有特定语法来描述数组类型和数组的存取,一个元素类型为 T 的数组用 Array [T ] 来表示。这里 Array 是一个标准的类,而 [T ] 是一个类型参数。实际上, Scala 的数组是继承自函数的,因此数组存取形式就像函数调用 a(i ) ,而不是像 Java 的 a[i ] 。数组将在 4.3 节进一步讨论。
- <!---->main 函数的返回类型是 unit , Java 中是 void 。这种处理源自于这样一个事实: Scala 中语句和表达式没有区别。每一个函数都返回一个值,如果一个函数的右侧是一个 block ,那么这个 block 的最后一个表达式的求值将作为其返回值。 Unit 类型的返回值可能是一个平凡值 {} 。其他的控制结构,如 if-then-else 等,也被泛化为表达式。
- <!---->Scala 采纳了 Java 绝大部分控制结构,但不包含传统的 for 语句。作为替代, Scala 包含 for-comprehensions ,它允许直接遍历数组、列表、迭代器等数据结构而无需使用索引。 Java 5.0 也包括了扩展的 for 循环,有点类似于 Scala 的 for-comprehensions ,但要严格很多。(一般还有文章对于 list-comprehensions 进行翻译或者探讨翻译的方式,目前尚未有结论。而 for-comprehensions 这种语法结构的名词还没有在其他语言中看到,因此暂不作任何翻译的尝试了——译注)
尽管语法上存在差异, Scala 程序和 Java 程序进行互操作没有任何困难。如上例所示 , Scala 程序调用了 String 类的 startWith 和 substring 方法,而这里的 String 是一个 Java 类。它还访问了 Java 的 System 类的 out 这一静态属性,并且调用其经过重载的 println 方法。实际上 Scala 的类根本没有静态成员这一概念,但是上述调用仍然成为可能,这是因为每一个 Java 类在 Scala 中对应两个实体:一个是包含了所有动态成员的类,一个是包含了所有静态成员的单例对象。因此 System.out 这一属性是通过 Scala 的 System 这个单例对象来访问的。
此外,上例中并未描述的是, Scala 的类 / 对象还能够继承 Java 类或实现 Java 定义的接口,这使得在 Java 框架中调用 Scala 代码成为可能。例如,一个 Scala 类可以实现 Java 的 java.util.EventListener 接口,从而使该 Scala 类的实例可以接收到 Java 代码发出的事件。
分享到:
相关推荐
在Scala的Source库的大力帮助下,一种面向对象的方法可以进行HTTP / HTTPS请求和Java网络包的部分实现。 用法 该存储库的主要目的是能够为HTTP / HTTPS请求及其使用案例(例如获取或发送数据)提供一种实现。 这主要...
该库解决了Scala开发人员在使用Java电子表格库时遇到的问题,这些问题代表了一种高度非功能性的方式,需要以这种方式生成电子表格(可变状态,强制索引,执行顺序依赖性)。 为了解决此问题,SPOIWO引入了自己的...
平台类似语言的一小部分。 除了嵌入之外,它还可以作为独立的解释器运行,并具有允许调试和分析程序的开发环境。 并行编译 Tern 程序可以分成多个源文件,这些源文件定义了代表执行流程的类型和函数。 为了最大限度...
平台类似语言的一小部分。 除了嵌入之外,它还可以作为独立的解释器运行,并具有允许调试和分析脚本的开发环境。 并行编译 Snap 程序可以分成多个源文件,这些源文件定义了代表执行流程的类型和函数。 为了最大限度...
scala-libs-for-android-emulator为您提供了一种简便的方法(可从SDK或genymotion)在Android模拟器上预安装scala库,从而可以加快开发速度,因为您无需将scala库包含在调试中然后建立。 我也在当前的仿真器映像...
是一种新型的连接处理引擎。 我们的 . 简要概述如下。 联接在数据处理中无处不在,通常是经典 RDBMS 工作负载的瓶颈。 最近的数据库理论表明,以成对方式计算连接的 Selinger 风格连接优化器是渐近次优的。 因此,...
Slang是一种OO / FP编程语言,具有用于正式验证和分析的合同和证明语言。 也就是说,它是下一代验证程序和证明检查器以及其他基于正式方法的分析技术的基础。 当前,它是Scala 2.13的子集,具有通过Scala的和功能...
系列博客是学习厦门大学林子雨老师spark编程基础课程的笔记,方便回顾... Spark SQL目前支持Scala、Java、Python三种语言,支持SQL-92规范 •DataFrame的推出,让Spark具备了处理大规模结构化数据的能力,不仅比原有的
概述来自数学问题解决方案46 直到 _(Scala,07/2012) 这个集合是在 ... 这些解决方案(大部分)将 C++ 视为一种过程语言,并在少数情况下(出于学习目的)重新发明轮子。 位置:src/euler/archives各种各样的 欢迎
Scala: ⼀种具有⾯向对象风格、函数式风格、更⾼层的并发模型的编程语⾔。同时Scala是⼤数据处理平台Spark的实现语⾔。 3 数据挖掘的模型知识 机器学习和数据挖掘是紧密相关的,要进⾏数据挖掘需要掌握⼀些机器学习...