一、Scala介绍
1、Scala 是一门多范式(multi-paradigm)的编程语言,集成面向对象编程和函数式编程的各种特性。
2、特征:
java和scala可以混编
-
运行在jvm之上,可以和java混编;
-
scala可以调用java的包或类,Java也可以调用Scala的包或类
类型推断
- scala中用val(表示常量)/var(表示变量)来表示变量类型,不需要显式的定义变量的是数据类型,可以自动推测出来,但不是说是弱语言类型。
并发和分布式
- 使用Actor作为其并发模型。Actor是一种类似于线程的实体
Trait(特性)
-
类似于java中 interface 和 抽象类 的结合,既可以定义变量也可以定义常量,既可以写方法体的实现,也可以写方法体的不实现。
模式匹配
- 类似于 switch case,只不过功能更加强大,可以匹配各种类型的值、类型等。
高阶函数
- 函数式编程的体现。可以用其他函数作为当前函数的参数或输出结果
二、Scala基础语法
1、第一个Scala程序
交互式编程:
idea上的脚本编程:
1 package com.scala 2 3 object HelloWorld { 4 /* 这是我的第一个 Scala 程序 5 * 以下程序将输出'Hello World!' 6 */ 7 def main(args: Array[String]) { 8 println("Hello world!") 9 } 10 }
2、基本语法
-
语句可以用分号结束或换行符,每行后面可以不写分号
-
区分大小写。Scala对大小写敏感
-
类名首字母大写(eg:class MyScalaClass),方法名首字母小写(eg:def myScalaMethod())
- def main(args:Array[String]):是Scala程序的强制程序入口部分
-
注释:类似Java支持单行和多行注释。
-
Scala包:与java类似,使用package关键字定义包,使用import关键字引用包
3、数据类型
scala中的数据类型与java中的相似,使用时需要将首字母大写。此外也有不同的数据类型:
数据类型 | 描述 |
Byte | 8bit有符号数字,-128-127 |
Short | 16bit有符号数字,-32768-32767 |
Int | 32bit有符号数字 |
Long | 64bit有符号数字 |
Float | 32bit单精度浮点数 |
Double | 64bit双精度浮点数 |
Char | 16bit字符 |
String | 字符串 |
Boolean | 布尔类型 |
Unit | 无值,与其他语言中void等同 |
Null | 空值或者空引用 |
Nothing | 所有其它类型的子类型(类型推断) |
Any | 所有类型的超类,任何实例都属于Any类型 |
AnyRef | 所有引用类型的超类 |
AnyVal | 所有值类型的超类 |
辨析:
Null | Trait,唯一实例是null,是AnyRef的子类 |
Nothing | Trait,所有类型的子类,没有实例 |
None | Option的两个子类之一,用于安全的函数返回值 |
Unit | 无返回值的函数类型(等同于java中的void) |
Nil | 长度为0的list |
4、变量与常量
在Scala中,使用关键词“var”声明变量,使用关键词“val”声明常量,变量的值可以修改,常量的值不可以修改
声明类型在变量名之后,等号之前声明
Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错。
5、选择分支语句
(1)语法:
if(){ 执行代码 }else{ 执行代码 }
(2)实例:
(3)注意:
-
1.If else具有返回值,重点。
-
2.如果有多个值的情况下,最后一行的返回值生效。
-
3.不加{ }只能适配一行内容。
-
4.如果两个分支,返回数据不一样,那么找寻最近的那个父类。
- 5 如果满足返回字符串,不满足可能返回Int类型,所以返回类型是Any类型。
- 6.如果没有返回值返回小括号 ()= unit = void,在Scala中是一个函数。
6、for循环
(1)增强for循环,类似于java中的 foreach循环
object HelloWorld { def main(args: Array[String]): Unit = { val data=Array(1,2,3,4,5,6,7,8) for (elem <- data){ //输入data.for点回车键自动生成 println(elem) } } }
(2)并列for循环
即一个表达式中放两个条件
def main(args: Array[String]): Unit = { for(a<-1.to(9);b<-1 to a){ print(b+"*"+a+"="+(a*b)+"\t") if(a==b)println() } }
(3)双重for循环
def main(args: Array[String]): Unit = { for (a<-1 to 9){ for(b<-1 to a){ print(a+"*"+b+"="+(a*b)+"\t") } println() } }
(4)普通for循环
注意:
-
1-使用下标的形式:和Java中的 for(int i=0;i<arr.length;i++)一样的。
-
2-取值范围方法: to:包前包后 until:包前不包后
def main(args: Array[String]): Unit = { val data=Array(1,2,3,4,5,6,7,8) for (elem <- 0 to data.length-1){ //输入data.for点回车键自动生成 print("["+elem+"] ") print(data(elem)+" ") } println(); for (e <- 0 until data.length-1){ print("["+e+"] ") print(data(e)+" ") } }
(5)守卫for循环
即在for循环表达式中添加If选择判断语句
def main(args: Array[String]): Unit = { for(a<-1 to 20 if(a%2==0)){ print(a+" ") } }
(6)带返回值的for循环:[yield关键字]
注意:
-
1- for是没有返回值的,如果想让for循环有返回值得使用: “yield”关键字 :
-
2- FOR 循环中的 “yield” 关键字会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。
-
3- 如果想让FOR循环有返回值,不能使用 { }
def main(args: Array[String]): Unit = { val arr=Array(1,2,3,4,5,6) val res=for (elem <- arr) yield elem*10 for(r<-res){ println(r) } }
7、while循环
注意:scala中没有++和--
实例:使用while循环打印-100内所有偶数
def main(args: Array[String]): Unit = { var a=0; //初始化值 while(a<=100){ //判断条件 if(a%2==0){ print(a+" ") } a+=1 //变化条件 } }
8、do...while循环
实例:使用while循环打印-100内所有偶数
def main(args: Array[String]): Unit = { var a=1 do{ if(a%2==0){ print(a+" ") } a+=1 }while(a<=100) }