Scala介绍

一、基础约定

1.规则

(1)无分号:scala中如果一行只包含一条语句,那么语句后面可以不加分号;

(2)对象的世界:在scala中,任何类型都是对象。

         ——1.toString() // 返回字符串 "1",在这段语句中1是Int对象,它含有toString()方法;

         ——函数也是对象,函数是这个世界的一等公民(这体现了scala中函数式编程的特点)

2.声明值和变量

(1)Scala使用有两种关键字来声明值或变量:

val:不变量,相当于java中的final

var:可变量

在scala中,vala使用得更加频繁,Eg:

val answer = 8 * 5 + 2

(2)scala的变量类型通常为缺省,如果不缺省,要使用如下形式

val greeting: String = null

,变量类型使用冒号放在变量名的后面。

3.方法调用

(1)在scala中,方法的调用与java相同,但是又有所扩展。例如:

对象T t=new T();调用方法:t.method(5)与java中相同,但有可以写成:t method 5——即剩略点号和括号。

(2)对于没有参数的方法,scala中可以不写括号,eg:

1.toString()可改写为1.toString;

4.基本数据类型

scala中有java中的基本数据类型,但它们都是对象形式。在使用时,可以自动转换为各自相应的Rich类型,Eg:

1.toString(),其中1是Int类型,但是该类型没有toString()方法,所以调用时由Int类型转换为RichInt类型;类似的有double-RichDouble,long-RichLong等。

5.运算符重载

(1)前面我们了解到scala中,一切都是对象,所以“1+1”实际上是1.+(1),其中+为运算符,我们在这里将其重载为方法:.+(),根据上面的省略规律,1.+(1)可改写为1+1;其它运算符也遵循相似的原则。

(2)但是scala中没有++与--运算,替代它们的是+=1 或 -=1;

(3)apply方法

在scala中普遍使用类似函数调用的语法. 例如,

如果s是一个string类型,那么s(i)是string的第i个字符。其中,s(i)是由s.apply(i)简化而来的。在scala的对象中,apply方法总是可以去掉方法名

二、控制

1.关于返回值
在scala任何的函数、表达式、方法都有返回值(有些情况类似与java的void,所以scala创立了unit这个标识符来表示特殊的返回值)。
(1){}的返回值以其中最后一个表达式的返回值为准,eg:

{val r=1;r+1},该表达式的返回值就是2,因为r+1的返回值为2;
(2)赋值表达式的返回值为unit,eg:
val k=5,该表达式的值为unit的形式;
注意:在给变量赋值的时候,注意负数的书写: var t=-1 ,这种写法可能会报错,必须将负数符号与等号加一个空格。


2.选择表达式的值

(1)Scala 包含 if/else 的结构 与 Java 或 C++中的相同。但是在scala中if/

else表达式是有值的——称为if或else表达式的值。例如:

val test=1

if(test>0) 1 else -1

语句运行后,输出:

res14: Int = 1

其中,1就是这个表达式的值,你可以将这个值赋予其它的变量: val s = if (x > 0) 1 else -1

,当然也可以写成:if (x > 0)s= 1 else s=-1,但是第一种写法比较好,因为第一种写法可以用来初始化val类型的变量,
而第二种方法中的s只能是var类型的。同时在java中有一个式子和它的功能相同:x > 0 ? 1 : -1;
 

(2)在scala中每个表达式都有它们的类型, if (x > 0) 1 else -1表达式的类型就是Int,当然if/else表达式也有混合值,比如:
if (x > 0) 1 else“good”;
但是它们的返回值有意个共同的超类:Any。也就是Any相当于万金油,类似于java中的Objetc。

如果表达式缺少了else,它怎样取值呢?在scala中,表达式总是要有一个值的,面对这个情况,scala创造了unit类型,这类似与java中的
voido类型,所以 if (x > 0) 1 可能会返回unit。


3.输入与输出
scala中常用的输出为:
print("hello ")或println(2),只要对java多少有点了解的人都知道,这里跟java中的相似,就是少了System.out;
另外还可一写成C++中的方式:printf()等。

4.循环
(1)常用循环
java中的循环语句scala中while关键字可以直接拿过来用,要注意的是,scala不支持传统的for循环。但是要想更好地学习scala,理解函数

式编程,就要学会scala中特有的循环方式:
     for (i <- 1 to n)
          r = r * i
下面为大家介绍该语句的原理:

1 to n 为 1.to(n),该语句返回一个集合,该集合包含1到n之间的所有整数,优点类似与arraylist<Integer>这种方式。其中“1 to n”也可写成1 untils n+1的方式,都是返回1到n之间的所有整数集合。另外,只要是集合类型都可以用于该方法中,eg:
var sum = 0
for (ch <- "Hello") sum += ch
"Hello"在这里被认为字符集合。
补充:

(2)双重循环
双重循环可以使用java中循环叠加的方式实现,也可使用如下方式实现:
for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + " ")
// Prints 11 12 13 21 22 23 31 32 33

在循环体中,还可以嵌套处理语句
for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
// Prints 12 13 21 23 31 32

for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
// Prints 13 22 23 31 32 33

for与yeild循环
for (i <- 1 to 10) yield i % 3
// 返回 Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)
加入yeild关键字,会返回一组集合类型,这种形式的循环被称作for 理解。


(3)跳出循环
在scala中,并不提供break或continue等语句,如果要跳出循环,有以下语句:
1. 使用一个布尔控制变量代替——while循环中
2. 使用return
3. 使用Breaks对象中的break方法:
import scala.util.control.Breaks._
breakable {
for (...) {
if (...) break; // Exits the breakable block
...
}
}

注意:在scala常常避免使用for循环(这是for循环在scala中的实现形式决定的),会采用

其它方式;另外for循环和while循环的性能差距比较大

scala>

  var start = System.currentTimeMillis();

  var total = 0;for(i <- 0 until 10000000) { total += i };

  var end = System.currentTimeMillis();

  println(end-start);

114

scala>

scala<

  var start = System.currentTimeMillis();

  var total = 0;var i=0;while(i < 10000000) { total += i ;i=i+1 };

  var end = System.currentTimeMillis();

  println(end-start);

8



5.函数
除了方法外,scala还具有函数元素;scala与java的方法要通过类的对象来调用,在java中要实现函数的功能就要依附于类而存在。我们说过在scala的世界中,函数也是对象,而且是这个世界的一等公民,所以函数定义后可以像对象那样使用,eg:
def abs(x: Double) = if (x >= 0) x else -x
你必须指定所有参数的类型. 如果函数不是递归的(程序调用自身的编程技巧称为递归,递归函数必须要有返回值,并知道返回值的类型),所以你不必规定返回类型,scala编译器从等号右边的表达式来决定返回值的类型;
如果函数比较复杂,则使用块来标识函数,eg:
def fac(n : Int) = {
var r = 1
for (i <- 1 to n) r = r * i
r
},函数的返回值就是块的返回值;上面代码的返回值为r,因为块的最后一句是r,r的返回值就是r的值本身;
对于递归函数,必须规定返回值,eg:
def fac(n: Int): Int = if (n <= 0) 1 else n * fac(n - 1)
scala中函数与方法的区别
是否带等号的就是函数,不带等号的就是方法?
否,函数若没有返回值可以不写等号;

6.方法

7.慵懒变量
如果在val类型的变量前面加入lazy标识符,则改变量的初始化就会放在使用它的时候,这样可以在初期的初始化过程中,节省时间,方便系统的启动
,在另一种意义上说这是一种负载均衡,eg:
lazy val words =“word”,只有在使用时,words才会被真正赋值;

 

8.异常
在scala中,异常的定义与java中相似,不过抛出异常操作的类型为nothing,捕获异常处理使用特殊的模式匹配语法:

try {
process(new URL("http://horstmann.com/fred-tiny.gif"))
} catch {
case _: MalformedURLException => println("Bad URL: " + url)
case ex: IOException => ex.printStackTrace()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值