Scala 入门3(类、Trait、模式匹配、正则、异常、提取器、IO)

学自 https://www.runoob.com/scala/scala-tutorial.html

1. 类和对象

object myClass {
    import java.io._
    class Point(xc : Int, yc : Int){
        var x : Int = xc
        var y : Int = yc
        def move(dx:Int, dy:Int): Unit ={
            x += dx
            y += dy
            println("x : " + x)
            println("y : " + y)
        }
    }

    // 继承,只能单继承
    class Piont3D( val xc : Int, val yc : Int,
                  val zc : Int) extends Point(xc, yc){
        var z : Int = zc
        def move(dx:Int, dy:Int, dz:Int): Unit ={
            x += dx
            y += dy
            z += dz
            println("x : " + x)
            println("y : " + y)
            println("z : " + z)
        }
    }
    def main(args: Array[String]) = {
        val p1 = new Point(10, 20)
        p1.move(2, 3)
        // x : 12
        // y : 23

        val p2 = new Piont3D(10, 30, 50)
        p2.move(1,2,3)
        // x : 11
        // y : 32
        // z : 53

        val fred = new Employee
        fred.name = "Fred"
        fred.salary = 50000
        println(fred) // myClass$Employee[name=Fred][salary=50000.0]
    }
    class Person {
        var name = ""
        override def toString = getClass.getName + "[name=" + name + "]"
    }

    class Employee extends Person {
        var salary = 0.0
        override def toString = super.toString + "[salary=" + salary + "]"
    }
}

2. Trait

	// Trait 特征, 很像 Java 的抽象类
    trait Equal {
        def isEqual(x : Any) : Boolean
        def isNotEqual(x : Any) : Boolean = !isEqual(x)
    }
    class Point2(xc : Int, yc : Int) extends Equal {
        var x : Int = xc
        var y : Int = yc
        def isEqual(obj : Any) = {
            obj.isInstanceOf[Point2] && obj.asInstanceOf[Point2].x == x
        }
    }

必须实现 没有实现的isEqual,或者 声明 Point2 为抽象类 abstract class Point2

		val p3 = new Point2(2, 3)
        val p4 = new Point2(2, 4)
        val p5 = new Point2(3, 3)

        println(p3.isNotEqual(p4)) // false
        println(p3.isNotEqual(p5)) // true
        println(p3.isNotEqual(2)) // true

3. 模式匹配

object myMatch {
    def main(args: Array[String]) ={
        println(matchTest(3)) // many
        println(matchTest(2)) // two
        println(matchTest(1)) // one

        println(matchTest1("two")) // 2
        println(matchTest1("test")) // others
        println(matchTest1(1)) // one
        println(matchTest1(6)) // isInt, 顺序遇到符合的就退出,剩余的不匹配

        val alice = new Person("alice", 18)
        val bob = new Person("bob", 19)
        val michael = new Person("michael", 20)
        for(p <- List(alice, bob, michael)){
            p match {
                case Person("alice", 18) => println("hi, alice")
                case Person("bob", 19) => println("hi, bob")
                case Person(name, age) => println(name + " " + age)
            }
        }
        // hi, alice
        // hi, bob
        // michael 20

    }
    def matchTest(x : Int) : String = x match {
        case 1 => "one"
        case 2 => "two"
        case _ => "many" // 类似 default
    }
    def matchTest1(x : Any) : Any = x match {
        case 1 => "one"
        case "two" => 2
        case y : Int => "isInt" // 是不是 Int 类型
        case _ => "others"
    }

    // 样例类
    case class Person(name : String, age : Int)
}

4. 正则

		// 正则表达式
        import scala.util.matching.Regex
        val pat1 = "Scala".r
        val s = "Scala is scalable and cool"
        println(pat1 findFirstIn s) // Some(Scala)
        val pat2 = new Regex("(S|s)cala") // 首字母 S or s
        println((pat2 findAllIn s).mkString(" - ")) //使用分隔符连接所有匹配
        // Scala - scala
        println(pat2 replaceFirstIn(s, "Java"))
        // Java is scalable and cool
        println(pat2 replaceAllIn(s, "Java"))
        // Java is Javable and cool

5. 异常处理

		// 异常处理
        import java.io.FileReader
        import java.io.FileNotFoundException
        import java.io.IOException
        try{
            val f = new FileReader("input.txt")
        }
        catch {
            case e : FileNotFoundException => {
                println("missing file!")
            }
            case e : IOException => {
                println("IO Exception")
            } // 一般把具体的异常写在前面,否则捕获了一个普遍的异常,后面的具体异常没有捕获
        }
        // missing file!
        finally { // 都会执行的部分
            println("finally step")
        } // finally step

6. 提取器

		// 提取器是一个带有unapply方法的对象
        def apply(user : String, domain : String) = {
            user + "@" + domain
        }
        def unapply(email : String) : Option[(String, String)] = {
            val parts = email split "@"
            if(parts.length == 2)
                Some(parts(0), parts(1))
            else
                None
        }
        println(apply("michael", "csdn.net")) // michael@csdn.net
        println(unapply("michael@csdn.net")) // Some((michael,csdn.net))
        println(unapply("michael csdn")) // None
object myExtractor {
    //提取器使用模式匹配
    def main(args : Array[String]) = {
        val x = myExtractor(5) // 自动调用apply
        println(x) // 10

        x match{ // 在提取器对象中使用 match 语句是,unapply 将自动执行
            case myExtractor(num) => println(x, num) // 自动调用 unapply (10,5)
            case _ => println("无法计算")
        }
    }
    def apply(x : Int) = {
        x*2
    }
    def unapply(z : Int) = {
        if(z%2 == 0)
            Some(z/2)
        else
            None
    }
}

7. 文件 IO

object MyIO {
    import java.io._

    def main(args: Array[String]): Unit = {

        // 写入文件
        val writer = new PrintWriter(new File(("test.txt")))
        writer.write("scala hah\nhello michael") // 产生文件 test.txt (内容scala hah...)
        writer.close()

        // 从屏幕获取输入
        val input = scala.io.StdIn.readLine()
        println(input) // 讲输入的内容打印出来

        // 从文件读取
        import scala.io.Source
        Source.fromFile("test.txt").foreach{
            print
        }
        // scala hah
        // hello michael
    }
}
相关推荐
<p> <span style="font-size:14px;color:#E53333;">限时福利1:</span><span style="font-size:14px;">购课进答疑群专享柳峰刘运强老师答疑服务</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;"></span> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>为什么需要掌握高性能的MySQL实战?</strong></span> </p> <p> <span><span style="font-size:14px;"><br /> </span></span> <span style="font-size:14px;">由于互联网产品用户量大高并发请求场景多,因此对MySQL的性能可用性扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了</span><span style="font-size:14px;">「高性能 MySQL 知识框架图」</span><span style="font-size:14px;">,帮你梳理学习重点,建议收藏!</span> </p> <p> <br /> </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006031401338860.png" /> </p> <p> <br /> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;">课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理数据库的性能调优高并发海量业务处理面试解析等。</span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;"></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>一性能优化篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括经典 MySQL 问题剖析索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>二MySQL 8.0新特性篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>三高性能架构篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>四面试篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。</span> </p>
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页