Scala与Java具有很多相似之处,但又有很多不同。这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变。

这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方。以下列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码演示样例及具体阐述见下文。


  • Scala中可直接调用Java代码,与Java无缝连接。
  • 语句能够不用“;”结束。且推荐不适用“;”。
  • 变量声明时以var或val开头。可不必指定变量类型,编译器可判断变量类型;
  • 函数能够不定义返回值类型(特殊情况除外);
  • 函数返回值可不用return返回;
  • 无參函数定义及调用时,函数名后可不跟括号;
  • 数组訪问下标使用括号,而不用中括号。
  • 元组使用“._n”的方式訪问元素。n从1開始;
  • ……。

指定Main函数

  在Java中运行程序,仅仅要指定入口的Main函数就可以。一个project中能够有多个Main函数,每一个类内都能够定义Main函数。可是与Java不同的是,Scalaproject中。仅仅有定义在object中的Main函数才干作为程序入口,下图中定义在class中的Main函数是无法作为程序入口的。


这里写图片描写叙述
  要想程序能够运行。须要例如以下图所看到的,将Main函数定义在object中。在Scala中,class同Java中的类一样,可是Scala中没有static类型的类,与此同一时候。Scala中提供了一种object的定义方式。通过这样的方式定义的“类”相似于Java中的static类,使用时不须要new对应的对象,直接使用外面能訪问的变量和函数。object中定义的方法也相似于static方法,直接通过object名訪问。
这里写图片描写叙述

变量和字段声明

  与Java中定义变量不同。在Scala中变量是通过“var|val 变量名 [: 类型] = 值”这样的方式声明和定义的。在声明字段的时候。能够使用编译器自己主动判断类型,即不用写“ : 类型”,比方

var i : Int = 2;
或直接
var i = 2;

  var和val的差别是:var声明的变量的值之后还能够改变,而val声明的变量仅仅能在声明时赋值。之后不能改变该变量的值(相似仅仅读变量。但不是常量)。Scala的函数式编程更推荐使用val。

类的定义及不同

  例如以下图所看到的,在Scala中也是通过class关键字定义类,看起来与Java中相似。在Scala类中默认的訪问符是public,假设不明白的写明private或其它訪问符,则类里的成员默认都是能够公开訪问的。
这里写图片描写叙述
  可是Scala在构造函数方面与Java存在很多不同,Scala类中包括主构造器和附属构造器。Scala中类的主构造器:主构造器直接跟在类名后面。主构造器中的參数会被编译成类的字段;主构造器运行的时候会运行类中的全部不包括在方法体中的语句;假设在主构造器函数的參数中没实用val或者var去声明变量。那此时的变量是private[this]级别的,仅仅能够被类内部訪问。Person类的主构造器例如以下图所看到的。主构造器中的參数name和age会被作为Person类的两个成员变量,未被包括在不论什么方法内部的打印语句会作为主构造器中的语句被运行。
这里写图片描写叙述
  由于上图中定义的age没有使用val或var修饰,所以会被作为private类型的成员变量使用,这类变量仅仅能在类内部訪问。

因此例如以下图所看到的,name能在类外部訪问,而age不能被外部訪问。
这里写图片描写叙述
  以上是主构造器的情况。Scala中还包括一类附属构造器,即除主构造器外的其它构造函数,附属构造器有以下特点:附属构造器是用this来声明的;附属构造器中必须调用主构造或者其它附属构造器。例如以下图所看到的为附属构造器的样例。
这里写图片描写叙述

特别的函数定义

  Scala中的函数定义与Java中有所差别,整体来说例如以下这样的方式,返回值类型在參数列表后面通过“: 类型”这样的方式指定,然后通过“=”承接函数体。对于无返回值类型的,类型能够写“Unit”(相似Java中的void),对于函数体简单的。“=”后面可直接接语句。不用“{}”。


这里写图片描写叙述
  与Java不同的是,语句块或函数返回值能够不用显示的通过“return”语句返回,一般块的最后一个表达式的值就是函数的返回值。因此上述函数可改动为以下的形式。
这里写图片描写叙述
  同变量声明不须要显示指定类型同样(变量能够判断变量类型),所以函数也能够判断返回类型。因此能够简写成例如以下所看到的:
这里写图片描写叙述
  然而,须要注意的是:假设函数使用return返回,那么必须明白指定函数的返回类型。此外假设是递归函数,也须要指定返回类型。下图所看到的为通过“return”返回的函数,函数定义时没有指定返回类型,编译器报错。


这里写图片描写叙述
  对于函数參数列表为空的,定义时函数名后能够不跟“()”,使用时也能够不跟“()”。例如以下图所看到的:
这里写图片描写叙述

数组及元组的使用

  两种数组定义例如以下图所看到的,与Java不同的是须要用到Array关键字。

同Java中一样,数组长度不可变,数组元素可变。
这里写图片描写叙述
  Scala中数组通过下标对元素訪问的方式例如以下图所看到的,主要通过2种方式,第一种是通过“arr(i)”这样的方式。与Java中不同,Java中主要通过“arr[i]”这样的方式訪问。

这是由于在Scala中,不论什么操作符都是函数调用的方式进行的。此外还提供了“arr.apply(i)”这样的訪问方式。


这里写图片描写叙述
  数组赋值和改动可通过以下两种方式进行,第一种适合代码显示赋值和改动,另外一种适合程序运行阶段依据条件对特定元素赋值和改动。
这里写图片描写叙述
  对于数组的遍历可通过以下2种方式。

当中第一种注意for循环的to也会取到。另外一种遍历方式是通过foreach的方式传递匿名函数。假设数组元素须要指定类型,须要用“(item : String)”括号括起来,假设处理代码较复杂,可用“{}”语句块表示。


这里写图片描写叙述
  Scala中元组的定义和元素訪问例如以下所看到的,定义时直接使用“()”将不同的类型的若干变量或字面值包围起来就可以。

值得注意的是。对于元组元素通过“._n”的方式进行訪问,且n从1開始计数。
这里写图片描写叙述

參考

Scala学习笔记系列
Scala基础之函数
Scala的循环和数组
面向 Java 开发者的 Scala 指南系列