Scala概述(二)一种类似Java的语言

2.       一种类似 Java 的语言

Scala 被设计成为可以与主流平台很好的交互,包括 JavaC# 。因此其绝大部分的基本操作符、数据类型和控制逻辑都与这两种语言相同。为简单起见,后面我们仅将 ScalaJava 作对比,由于 JavaC# 本身就有很多共同点,因此 Scala 绝大部分与 Java 的相似之处都可直接应用于 C# 。其实有些情况下 Scala 甚至更接近 C# ,例如对泛型的处理方面。

1 列出了 JavaScala 实现同样功能的两段程序,都是打印出程序命令行包含的所有选项。

 

// 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))

  }

}

 

1ScalaJava 程序示例

 

这个示例显示出两种语言很多相似性:他们都有 String 这种基本类,调用同名的方法,使用同样的操作符、同样的条件控制结构等。示例同时也体现两种语言的差异,包括:

 

  • Scala 除类定义之外,还有对象定义的概念(以 Object 开头)。对象定义实际上是定义了一个只有单个实例的类,也就是通常所说的单例( singleton )。在上例中, PrintOptions 这个单例类有一个名为 main 的成员方法。
  • Scala 采用“名称:类型”的方式进行变量定义和参数传递,而 Java 是使用类型前缀的形式,也就是“类型 名称”。
  • Scala 的语法比 Java 的相对更规范:所有的定义都由一个关键字开始,如上例中的 def main ,开始定义一个方法。
  • Scala 不强制要求语句结束使用分号,分号是可选的。(原文中 Java 语句也没有分号,明显是错漏; Scala 两个语句都没有分号,我特意加了一个,更体现原意,当然是确保编译和运行正确的情况下——译注)
  • Scala 没有特定语法来描述数组类型和数组的存取,一个元素类型为 T 的数组用 Array [T ] 来表示。这里 Array 是一个标准的类,而 [T ] 是一个类型参数。实际上, Scala 的数组是继承自函数的,因此数组存取形式就像函数调用 a(i ) ,而不是像 Javaa[i ] 。数组将在 4.3 节进一步讨论。
  • main 函数的返回类型是 unit Java 中是 void 。这种处理源自于这样一个事实: Scala 中语句和表达式没有区别。每一个函数都返回一个值,如果一个函数的右侧是一个 block ,那么这个 block 的最后一个表达式的求值将作为其返回值。 Unit 类型的返回值可能是一个平凡值 {} 。其他的控制结构,如 if-then-else 等,也被泛化为表达式。
  • Scala 采纳了 Java 绝大部分控制结构,但不包含传统的 for 语句。作为替代, Scala 包含 for-comprehensions ,它允许直接遍历数组、列表、迭代器等数据结构而无需使用索引。 Java 5.0 也包括了扩展的 for 循环,有点类似于 Scalafor-comprehensions ,但要严格很多。(一般还有文章对于 list-comprehensions 进行翻译或者探讨翻译的方式,目前尚未有结论。而 for-comprehensions 这种语法结构的名词还没有在其他语言中看到,因此暂不作任何翻译的尝试了——译注)

 

尽管语法上存在差异, Scala 程序和 Java 程序进行互操作没有任何困难。如上例所示 , Scala 程序调用了 String 类的 startWithsubstring 方法,而这里的 String 是一个 Java 类。它还访问了 JavaSystem 类的 out 这一静态属性,并且调用其经过重载的 println 方法。实际上 Scala 的类根本没有静态成员这一概念,但是上述调用仍然成为可能,这是因为每一个 Java 类在 Scala 中对应两个实体:一个是包含了所有动态成员的类,一个是包含了所有静态成员的单例对象。因此 System.out 这一属性是通过 ScalaSystem 这个单例对象来访问的。

此外,上例中并未描述的是, Scala 的类 / 对象还能够继承 Java 类或实现 Java 定义的接口,这使得在 Java 框架中调用 Scala 代码成为可能。例如,一个 Scala 类可以实现 Javajava.util.EventListener 接口,从而使该 Scala 类的实例可以接收到 Java 代码发出的事件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值