A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

一、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
"进去交互模式"


  • Linux系统安装过程一模一样
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文件夹
      • 并标志位Sources Root【蓝色】
    • 创建的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之上的
    • Kotlin 和 Scala 的区别很小

四、 Scala基础A. Hello Scala
[AppleScript] 纯文本查看 复制代码
object HelloWorld {
  def main(args: Array[String]): Unit = {
   println("Hello Scala!")
  }
}

上面代码如果想打包在jvm上运行,我们通过maven的package
  • 运行后我们得到jar包
[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类型
    • Any为所有类型的公共超类型
  • 如果没有执行返回值,默认为unit : ()
    • 相当于java的void

[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类型的()
  • while循环
[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)


















0 个回复

您需要登录后才可以回帖 登录 | 加入黑马