美文网首页
Scala基础

Scala基础

作者: 阳光课代表 | 来源:发表于2019-08-08 09:45 被阅读0次

Scala概述

Scala设计的目的是整合面向对象编程和函数式编程。Scala运行于Java平台(JVM),并兼容现有Java程序。

Java和Scala程序Hello World对比

object Main {

    def main(a: Array[String]) = {
        println("Hello World") //Scala结尾的;并不强求,写与不写没有区别
    }

}

注:最显著的一个区别就是Scala程序不需要通过static关键字将main方法标记为静态方法。

val和var的区别(常量与变量)

val x = 12 // val定义的是一个常量
x = 13 // 报错,不能修改常量的值,使用var定义的是一个变量,但是Scala推荐使用val,除非真的需要改变变量的值,因为val没有线程安全性问题,效率高
val name: String = "cai" // 也可以指定变量的类型
val name, msg = null // 可以同时初始化多个变量(无论使用var或val声明变量一定要初始化,不然报错)

Scala基本数据类型

Byte/Char
Short/Int/Long/Float/Double
Boolean

    val a = 1.1
    println(a.getClass()) //double
    val b = 1.2f
    println(b.getClass()) //float
    //val c:Float = 1.3 //报错:类型不匹配

    //类型转换函数
    val d = 10.asInstanceOf[Double]
    println(d.getClass()) //double

    //判断是否是某个类型
    val e = 10.isInstanceOf[Int]
    println(e) //true

lazy关键字

    lazy val a = 1 //a并没有被赋值
    println(a) //a才被赋值

注:Scala中使用关键字lazy来定义惰性变量,实现延迟加载;惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。

函数

    def max(x: Int, y: Int): Int = {
        if (x > y)
            x
        else
            y
    }

注:函数中最后一行就是函数的返回值

    def main(a: Array[String]) = {
        println(add())
        println(add) //当方法没有参数时可以省略小括号
    }

    //方法的返回值类型可以省略,因为Scala可以推断
    def add() = 1 + 2

函数默认参数

    def main(a: Array[String]) = {
        printName() // name:cai 注:这个时候小括号不能省略
        printName("zhong") //name:zhong
    }

    def printName(name: String = "cai") = {
        println("name:" + name)
    }

函数命名参数

    def main(a: Array[String]) = {
        println(speed(time = 10, distance = 100)) //10.0
    }

    //方法的返回值是Double
    def speed(distance: Double, time: Int) = {
        distance / time
    }

注:不建议使用该功能

函数可变参数

    def main(a: Array[String]) = {
        println(sumN("cai", 1, 2, 3)) //6
    }

    //可变参数一定要位于最后
    def sumN(name: String, nums: Int*) = {
        println(name) //cai
        var res = 0
        for (num <- nums) {
            res += num
        }
        res
    }

if语句

println("请输入年龄:")
val age = StdIn.readInt()
if (age < 18) {
    println("未成年人")
} else if (age < 50) {
    println("中年人")
} else {
    println("老年人")
}

注:Scala中没有switch语句

for循环

for (i <- 1 to 3) { //[]左闭右闭
    print(i) //Out:123
}

val list = List("a", "b", 1, 2, 12.5)
for (item <- list) {
    print(item + " ") //Out:a b 1 2 12.5
}
val arr = Array(1, 2, 3)
arr.foreach(item => {
    print(item + " ") //Out:1 2 3 
})

for (i <- 1 until 3) { //[)左闭右开
    print(i) //Out:12
}

主构造器和辅助构造器

object Main {

    def main(a: Array[String]) = {
        val p1 = new Person("cai", 12) //调用主构造器
        p1.printInfo() //cai12false

        val p2 = new Person("zhong", 13, true) //调用附属构造器
        p2.printInfo() //zhong13true
    }

}

class Person(name: String, age: Int) {
    //val不能使用占位符,因为val只能赋值一次,后面不能再次赋值;占位符也不能使用在局部变量中,因为局部变量声明的时候必须要初始化
    private var sex: Boolean = _ //默认值是false

    def this(name: String, age: Int, sex: Boolean) {
        this(name, age) //附属构造器的第一行代码必须要调用主构造器或其他附属构造器
        this.sex = sex
    }

    def printInfo() = {
        println(name + age + sex)
    }

}

继承

object Main {

    def main(a: Array[String]) = {
        val stu = new Student("cai", 18, "math")
        println(stu.name + stu.age)
        //println(stu.major) //错误:无法访问,要想访问必须要使用var或val修饰
    }

}

class Person(val name: String, val age: Int) {
    println("Person Constructor enter")
    println("Person Constructor leave")
}
class Student(name: String, age: Int, major: String) extends Person(name, age) {
    println("Student Constructor enter")
    println("Student Constructor leave")
}
Output:
Person Constructor enter
Person Constructor leave
Student Constructor enter
Student Constructor leave
cai18

重写

object Main {

    def main(a: Array[String]) = {
        val stu = new Student()
        stu.pr1() //Student pr1
        stu.pr2() //Person pr2
    }

}

class Person() {
    def pr1() = {
        println("Person pr1")
    }

    def pr2() = {
        println("Person pr2")
    }
}
class Student() extends Person() {
    override def pr1() = {
        println("Student pr1")
    }
}

抽象类

object Main {

    def main(a: Array[String]) = {
        val stu = new Stu
        println(stu.name) //cai
        stu.say //cai
    }

}

abstract class Person {
    val name: String
    def say
}

class Stu extends Person {
    override val name: String = "cai"
    override def say: Unit = {
        println(name)
    }
}

//----------------------

for循环守卫

for (i <- 1 to 3 if i != 2) {
    print(i) //Out:13
}

for循环引入变量

for (i <- 1 to 3; j = 4 - i) {
    print(j) //Out:321
}
//等价于
for (i <- 1 to 3) {
    val j = 4 - i
    print(j) //Out:321
}

嵌套循环

for (i <- 1 to 2; j <- 1 to 2) {
    print(i + " " + j) //Out:1 11 22 12 2
}

循环返回值

var res = for (i <- 1 to 10) yield {
    if (i % 2 == 0) {
        i
    }
}
print(res) //Vector((), 2, (), 4, (), 6, (), 8, (), 10)

解释说明:对1到10进行遍历,将每次遍历得到的i经过处理将结果放到集合Vector中

相关文章

网友评论

      本文标题:Scala基础

      本文链接:https://www.haomeiwen.com/subject/gnrtjctx.html