zoukankan      html  css  js  c++  java
  • 0023.Scala编程语言1


    15-01-Scala语言简介


    15-02-Scala中的数据类型和变量常量

    	scala> var s1:String = "Hello World"
    	s1: String = Hello World
    
    	字符串的插值操作:相当于拼加字符串
    	scala> "My name is Tom  and ${s1}"
    	res1: String = My name is Tom  and ${s1}
    
    	scala> s"My name is Tom  and ${s1}"
    	res2: String = My name is Tom  and Hello World
    

    15-03-Scala的函数

    	scala> def sum(x:Int,y:Int):Int = x + y
    	sum: (x: Int, y: Int)Int
    
    	scala> sum(10,20)
    	res5: Int = 30
    
    	scala> var a = sum(10,20)
    	a: Int = 30
    
    	scala> def myFactor(x:Int):Int = {
    		 |    //采用阶乘
    		 |    if(x <= 1)
    		 |       1
    		 |    else
    		 |      //执行递归
    		 |      x*myFactor(x-1)
    		 | }
    	myFactor: (x: Int)Int
    
    	scala> myFactor(5)
    	res6: Int = 120
    

    15-04-Scala的循环

    package day01
    
    import sun.org.mozilla.javascript.internal.ast.Yield
    
    object A03 {
      def main(args: Array[String]): Unit = {
        var list = List("tom", "jerry", "mary");
    
        for (s <- list) {
          println(s);
        }
        println("------------------");
        for {
          s <- list
          if (s.length() > 3)
        } println(s)
        println("------------------");
        for (
          s <- list if (s.length() > 3)
        ) println(s)
    
        println("------------------");
        var newlist = for {
          s <- list
          s1 = s.toUpperCase()
        } yield (s1)
    
        for (s <- newlist) println(s);
        println("------------------");
        var i = 0
    
        while (i < list.length) {
          println(list(i))
          i += 1
        }
    
        println("------------------");
        var j = 0
    
        do {
          println(list(j))
          j += 1
        } while (j < list.length)
    
        println("11111111111111");
        list.foreach(println)
    
      }
    }
    

    15-05-函数参数的求值策略

    call by value定义: :
    对函数实参求值,并且只求一次
    call by name定义: :=>
    函数的实参在函数体内部每次用到的时候,都会被求值


    15-06-lazy懒值


    15-07-数组


    15-08-映射


    15-09-元组


    16-01-面向对象简介


    16-02-定义类

    //代表一个学生的信息
    class Student1 {
      //定义学生的属性
      private var stuID:Int = 0
      private var stuName:String = "Tom"
      private var age:Int = 20
      
      //定义成员方法(函数):get 和set
      //定义名字和年龄的get和set
      def getStuName():String = stuName
      def setStuName(newName:String) = this.stuName = newName
      
      def getStuAge():Int = age
      def setStuAge(newAge:Int) = this.age = newAge
    }
    
    //测试Student1类,创建main函数(写到Object中)
    //注意:object和class的名字可以不一样,如果一样了,这个object就叫做该class的伴生对象
    object Student1{
      def main(args: Array[String]): Unit = {
        //创建学生对象
        var s1 = new Student1
        
        //第一次访问属性并输出
        println(s1.getStuName()+"	"+s1.getStuAge())
        
        //访问set方法
        s1.setStuName("Mary")
        s1.setStuAge(22)
        println(s1.getStuName()+"	"+s1.getStuAge())
        
        //再输出一次:直接访问私有的属性
        println("*************直接访问私有的属性************")
        println(s1.stuID +"	"+ s1.stuName+"	"+s1.age)
        
        //注意:可以直接访问类的私有成员  为什么可以? ----> 属性的get和set方法
        
      }
    }
    

    16-03-内部类


    16-04-类的构造器


    16-05-object对象

    //实现一个单例模式:自动生成卡号
    object CreditCard {
      //定义一个变量保存信用卡的卡号
      private[this] var creditCardNumber:Long = 0
      
      //定义函数来产生卡号
      def generateCCNumber():Long = {
        creditCardNumber += 1
        //返回卡号
        creditCardNumber
      }
      
      //测试程序
      def main(args: Array[String]): Unit = {
        //产生新的卡号
        println(CreditCard.generateCCNumber())
        println(CreditCard.generateCCNumber())
        println(CreditCard.generateCCNumber())
        println(CreditCard.generateCCNumber())
      }
    }
    
    //使用App对象:应用程序对象
    object HelloWorld extends App {
      
    //  def main(args: Array[String]): Unit = {
    //    println("Hello World")
    //  }
      
      //把main函数中的程序直接写到object中
      println("Hello World")
      
      //也可以直接通过args获取命令行的参数
      if(args.length > 0){
        println("有参数")
      }else{
        println("没有有参数")
      }
    }
    

    16-06-apply方法

    //定义一个类
    class Student3(var stuName:String)
    
    
    object Student3 {
      //定义Student3的apply方法
      def apply(name:String) = {
        println("*********调用到了apply方法*********")
        new Student3(name)  //调用到了主构造器
      }
      
      //测试程序
      def main(args: Array[String]): Unit = {
        //通过主构造器创建学生对象
        var s1 = new Student3("Tom")
        println(s1.stuName)
        
        //通过apply方法创建学生对象
        var s2 = Student3("Mary")
        println(s2.stuName)
      }
    }
    

    16-07-继承

    //继承1:父类 Person 人,  子类 Employee 员工
    
    //定义父类
    class Person(val name:String,val age:Int){
      //定义函数
      def sayHello():String = "Hello " + name + " and the age is " + age
    }
    
    //定义子类
    //override:表示希望使用子类中的值去覆盖父类中的值
    class Employee(override val name:String,override val age:Int,var salary:Int) extends Person(name,age){
      //在子类中,重写父类的函数
      override def sayHello():String = "子类中的sayHello方法"
    }
    
    
    object Demo1 {
      def main(args: Array[String]): Unit = {
        //测试程序
        //创建一个Person对象
        var p1 = new Person("Tom",20)
        println(p1.name+"	"+p1.age)
        println(p1.sayHello())
        
        //创建一个Employee的对象
        //可以使用子类对象
        var p2:Person = new Employee("Mike",25,1000)
        println(p2.sayHello())
        
        //通过匿名子类实现继承:没有名字的子类
        var p3:Person = new Person("Mary",25){
          //在匿名子类中重写sayHello方法
          override def sayHello():String = "匿名子类中的sayHello方法"
        }
        println(p3.sayHello())
        
        
      }
    }
    
    

    16-08-抽象类和抽象字段


    16-09-trait


    16-10-包和包对象


    17-01-函数式编程简介和匿名函数


    17-02-什么是高阶函数


    17-03-高阶函数示例

    高阶函数示例.png

    (*)map:相当于一个循环,对某个集合中的每个元素进行操作(就是接受一个函数),返回一个新的集合
    	         val numbers = List(1,2,3,4,5,6,7,8,9,10)
    			 numbers.map((i:Int)=>i*2)
    			 简写 numbers.map(_ * 2)
    			 
    	(*)foreach:相当于一个循环,对某个集合中的每个元素进行操作(就是接受一个函数),不返回结果
    	         numbers.foreach((i:Int)=>i*2)
    	
    	
    	(*)filter: 过滤,选择满足条件的数据
    			查询能够被2整除的数字
    			numbers.filter((i:Int)=> i%2==0) 如果是true,就返回结果
    	
    	(*)zip: 合并集合
    			List(1,2,3).zip(List(4,5,6))
    	
    	
    	(*)partition: 根据断言(就是条件,通过一个匿名函数来实现)的结果,来进行分区
    			举例:把能够被2整除的分成一个区,不能整除的分成另一个区
    			numbers.partition((i:Int)=> i%2==0)
    	
    	(*)find: 查找第一个满足条件(断言)的元素
    	        查询第一个能够被3整除的数字
    			numbers.find(_%3 == 0)
    	
    	(*)flatten:把嵌套的结构展开
    			List(List(2, 4, 6, 8, 10),List(1, 3, 5, 7, 9)).flatten
    	
    	(*)flatMap 相当于 map + flatten
    			var myList = List(List(2, 4, 6, 8, 10),List(1, 3, 5, 7, 9))
    			myList.flatMap(x=> x.map(_*2))
    			结果 res16: List[Int] = List(4, 8, 12, 16, 20, 2, 6, 10, 14, 18)
    			
    			过程 (1)将List(2, 4, 6, 8, 10)和List(1, 3, 5, 7, 9)调用x=> x.map(_*2)
    			     (2)再合并成一个List
    
  • 相关阅读:
    JVM性能调优的6大步骤,及关键调优参数详解
    JVM内存调优原则及几种JVM内存调优方法
    关于大型网站技术演进的思考(十六)--网站静态化处理—前后端分离—下(8)
    关于大型网站技术演进的思考(十五)--网站静态化处理—前后端分离—中(7)
    关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)
    关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
    关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
    关于大型网站技术演进的思考(十一)--网站静态化处理—动静分离策略(3)
    关于大型网站技术演进的思考(十)--网站静态化处理—动静整合方案(2)
    关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)
  • 原文地址:https://www.cnblogs.com/RoyalGuardsTomCat/p/13880031.html
Copyright © 2011-2022 走看看