美文网首页
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