一、Scala简述- 统计世界top100大学计算机系年级前三名,从初中开始编程,学过20多种语言,最后认为Scala最难
二、Scala安装与配置A. Windows系统安装- Scala需要Java运行时库,安装Scala需要首先安装JVM虚拟机,推荐安装JDK1.8
- 在 http://www.scala-lang.org/ 下载Scala2.11.8程序安装包
- 根据不同的操作系统选择不同的安装包,下载完成后,将安装包解压到安装目录
- 将scala安装目录下的bin目录加入到PATH环境变量
[Scala] 纯文本查看 复制代码 SCALA_HOME= D:\scala-2.11.8
在PATH变量中添加 : %SCALA_HOME%\bin
[Scala] 纯文本查看 复制代码 scala -version
"或者"
scala
"进去交互模式"
B. 配置IDEA- 打开IDEA工具,如图 : 点击Configure
- 点击Plugins
- 点击Install plugin from disk
- 选择scala的plugins
- 可以去该网下载【对应】版本的scala插件
- http://plugins.jetbrains.com/plugin/1347-scala
- 此时会显示一个Scala的条目,在右侧点击Restart IntelliJ IDEA
- 创建Maven项目
- 创建maven项目后在main文件夹下创建scala文件夹
- 创建的maven项目默认是不支持scala的,需要为项目添加scala的framework
- 右键【项目】,选择【Add Framework Support...】
- 在这里选择Scala后,在右边的Use library中配置你的安装目录即可,最后点击OK
- 如果没有,选择我们自己scala的解压包就好
- 在项目的目录结构中,创建scala文件夹,并标记为source
- 现在我们就可以创建scala classes了
- 创建时有3个类型【类比,不严谨】
- class : 【java代码】
- object : 【静态代码块】
- trait : 【Java接口】
三、 不同编程语言比较A. 不同编程语言的最小单元
[Scala] 纯文本查看 复制代码 "java"
class A{
public static void main(String[] args) {
System.out.println("HelloWorld!");
}
}
"c#"
namespace
{
class A
{
void Main(string[] args)
{
Console.write("Hello World")
}
}
}
"python"
print("Hello World")
"Scala"
println("Hello world")
"Node.js"
document.write("Hello World")
- Kotlin 和 Scala 都是建立在Java之上的
四、 Scala基础A. Hello Scala[AppleScript] 纯文本查看 复制代码 object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello Scala!")
}
}
上面代码如果想打包在jvm上运行,我们通过maven的package [AppleScript] 纯文本查看 复制代码 C:\Users\unkonw_yu\Desktop\scala>scala -cp scala_syllabus-1.0-SNAPSHOT.jar HelloWorld
- 问题
- 我们把maven项目clean后再执行package命令
- 运行上面的指令发现报错 : class not found exception
- 原因是我们的scala文件没有编译,我们随便运行一段scala代码,然后再执行package命令就ok
B. 声明值和变量- Scala声明变量有两种方式,一个用val,一个用var
- val / var 变量名 : 变量类型 = 变量值
- val定义的值是不可变的,它不是一个常量,是不可变量,或称之为只读变量
[Scala] 纯文本查看 复制代码 scala> val a1 = 10
scala> a1 = 20(此处会报错,因为val不允许初始化后再次修改a1变量的引用)
[Scala] 纯文本查看 复制代码 scala> var a2 = 10
scala> a2 = 20
尖叫提示: - scala默认为匿名变量分配val
- val定义的变量虽然不能改变其引用的内存地址,但是可以改变其引用的对象的内部的其他属性值
- 为了减少可变性引起的bug,应该尽可能地使用不可变变量
- 变量类型可以省略,解析器会根据值进行推断
- val和var声明变量时都必须初始化
[Scala] 纯文本查看 复制代码 var a: Int = 10
println(a)
C. 常用类型- 常用类型介绍
- Scala有8种数据类型:Byte、Char、Short、Int、Long、Float、Double以及Boolean
- 在Scala没有基本数据类型和引用数据类型之分,所有类型都是引用数据类型
- Scala中大部分针对集合的操作,都可以用于String
- 由于String在需要时能隐式转换为StringOps,因此不需要任何额外的转换,String就可以使用这些方法
D. 常用类型结构图- Scala中,所有的值都是类的对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any
- 统一类型,是Scala的又一大特点
- 更特别的是,Scala中还定义了几个底层类(Bottom Class),比如Null和Nothing
- Null是所有引用类型的子类型,而Nothing是所有类型的子类型
- Null类只有一个实例对象,null.类似于Java中的null引用
- null可以赋值给任意引用类型,但是不能赋值给值类型
- Nothing,可以作为没有正常返回值的方法的返回类型
- 非常直观的告诉你这个方法不会正常返回
- 而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容
- Unit类型用来标识过程,也就是没有明确返回值的函数
- 由此可见,Unit类似于Java里的void
- Unit只有一个实例 : ()
- 这个实例也没有实质的意义
E. 算数操作符重载- + 、-、 *、 / 、% 可以完成和Java中相同的工作,但是有一点区别,他们都是方法
- 符号来为方法命名
- Scala中没有 ++、--操作符,需要通过 +=、-=来实现同样的效果
[Scala] 纯文本查看 复制代码 scala> 1 + 2
等同于:
scala> 1.+(2)
[Scala] 纯文本查看 复制代码 class Dog {
@override
public int + (Dog dog) {
int legs = this.log + dog.leg;
reutrn legs;
}
}
F. 调用函数与方法(函数一定有返回值,方法不一定)- 在scala中, 一般情况下我们不会刻意的去区分函数与方法的区别,但是他们确实是不同的东西
[Scala] 纯文本查看 复制代码 scala> import scala.math._
scala> sqrt(100)
[Scala] 纯文本查看 复制代码 object UseFunction {
def main(args: Array[String]): Unit = {
import scala.math.sqrt
val a = sqrt(100)
println(a)
}
}
- 调用方法,静态方法(scala中没有静态方法这个概念,需要通过伴生类对象来实现)
[Sass] 纯文本查看 复制代码 scala> BigInt.probablePrime(16, scala.util.Random)
[Scala] 纯文本查看 复制代码 scala> "HelloWorld".distinct
apply与update方法 - apply方法是调用时可以省略方法名的方法,用于构造和获取元素
[Sass] 纯文本查看 复制代码 "Hello"(4) 等同于 "Hello".apply(4)
Array(1,2,3) 等同于 Array.apply(1,2,3)
// int[] arr = new int[]{1,2,3,4,5};
// var arr = Array(1,2,3,4,5)
如:
println("Hello"(4))
println("Hello".apply(4))
val arr1 = Array(1, 2, 3, 4)
val arr2 = Array.apply(1, 2, 3, 4)
println(arr1.mkString(" ")) // 1 2 3 4
println(arr2.mkString(" ")) // 1 2 3 4
- 在伴生类中写一个apply方法,就可以不使用new就可以得到对象
[Scala] 纯文本查看 复制代码 class Array {
}
object Array {
def apply() {
return new Array();
}
}
- 在StringOps中你会发现一个 def apply(n: Int): Char方法定义
- update方法也是调用时可以省略方法名的方法,用于元素的更新
[Scala] 纯文本查看 复制代码 arr(4) = 5 等同于 arr.update(4,5)
如:
val arr1 = Array(1, 2, 3, 4)
val arr2 = Array.apply(1, 2, 3, 4)
arr1(1) = 5
arr2.update(1, 5)
println(arr1.mkString(" ")) // 1 5 3 4
println(arr2.mkString(" ")) // 1 5 3 4
option类型(有2个类: Some 和 None)- Scala为单个值提供了对象的包装器,表示为那种可能存在也可能不存在的值
- 他只有两个有效的子类对象,一个是Some,表示某个值
- 另外一个是None,表示为空
- 通过Option的使用,避免了使用null、空字符串等方式来表示缺少某个值的做法
- 当我们对Scala集合进行读取操作的时候,如果你读取的地方有数据,就把数据封装到some集合返回给你
- 如果读取到的地方没有数据,则返回一个None对象给你
- 不会出现null的情况
[Scala] 纯文本查看 复制代码 val map1 = Map("Alice" -> 20, "Bob" -> 30)
println(map1.get("Alice"))
println(map1.get("Jone"))
[Scala] 纯文本查看 复制代码 val map = Map("name" -> "余浩宏", "age" -> "11")
println(map.get("name")) //Some(余浩宏)
println(map.get("name").get) //余浩宏
println(map("name")) //余浩宏
println(map.get("gender")) //None
println(map("xxx")) //报错
五、控制结构和函数A. if else表达式- scala中没有三目运算符,因为根本不需要
- scala中if else表达式是有返回值的,如果if或者else返回的类型不一样,就返回Any类型
- 如果没有执行返回值,默认为unit : ()
[Scala] 纯文本查看 复制代码 // 可以返回任意类型
val a = 10
val desc = if (a >= 10) {
"a 大于 10"
} else {
"a 小于 10"
}
println(desc)
// 只能返回指定类型
val b = 10
val desc_type : String = if (b >= 10) "b 大于 10" else "b 小于 10"
B. while表达式(无返回值)- Scala提供和Java一样的while和do-while循环
- While语句本身没有返回值,即整个While语句的结果是Unit类型的()
[Scala] 纯文本查看 复制代码 // 2. while
val result = while (a < 10) {
println("a的值是 :" + a)
a += 1
}
println("result = " + result) // ()
[Scala] 纯文本查看 复制代码 do{
println("a的值是 :" + a)
a -= 1
}while(a > 5)
while循环的中断 - scala并没有提供break和continue语句来退出循环
- 如果需要break,可以通过几种方法来做
- 使用Boolean型的控制变量
- 使用嵌套函数,从函数中return
- 使用Breaks对象的break方法
[Scala] 纯文本查看 复制代码 import scala.util.control.Breaks
val loop = new Breaks
loop.breakable({
while(n <= 20){
n += 1;
if(n == 18){
loop.break()
}
}
})
println(n)
|