Scala-01

scala
-------------
    java语言的脚本化。
    


REPL
-----------------
    read + evaluate + print + loop

安装scala解释程序
------------------
    1.scala-2.12.1.msi
    2.进入scala命令行

        //变量
        scala>var a = 100            //变量

        //常量
        scala>val a = 100            //常量,不能重新赋值。

        //定义类型
        scala>val a:String = "hello" ;
        scala>a = "world"            //wrong


    //操作符重载 _ $
    scala>1 + 2
    scala>1.+(2)                    //


    //scala函数,没有对象.
    //scala方法,通过对象调用。
    scala>import scala.math._        //_ ===> *
    scala>min(1,2)

    //
    scala>1.toString                //方法
    scala>1.toString()                //方法形式
    scala>1 toString                //运算符方式

    //apply
    scala>"hello".apply(1)            //等价于xxx.apply()
    scala>"hello"(1)                //

    //条件表达式,scala的表达式有值,是最后一条语句的值。
    scala>val x = 1 ;
    scala>val b = if x > 0 1 else -1 ;

    //Any 是Int和String的超类。

    //类型转换
    scala>1.toString()
    scala>"100".toInt()                //

    //空值
    scala>val y = (x = 1)            //y:Unit= ()类似于java void.
        
    
    //粘贴复制
    scala>:paste
            ....
        ctrl + d                    //结束粘贴模式

        javac               java
        *.java --------> *.class  -------->程序 


    //输出
    scala>print("hello")
    scala>println("hello")
    scala>printf("name is %s , age is %d", "tom",12);
    //读行
    scala>val password = readLine("请输入密码 : ") ;

    //查看帮助
    scala>:help
    

    
    //循环
    scala>:paste
        var i = 0 ;
        while(i < 10 ){
            println(i) ;
            i += 1;
        }

    //99表格
    scala>:paste
        var row = 1 ; 
        while(row <= 9 ){
            var col = 1 ; 
            while(col <= row){
                printf("%d x %d = %d\t",col,row,(row * col)) ;
                col += 1 ;
            }
            println();
            row += 1 ;
        }
    
    //百钱买白鸡问题.
        100块钱100只鸡。
        公鸡:5块/只
        母鸡:3块/只
        小鸡:1块/3只
    
    //公鸡
    var cock = 0 ;
    while(cock <= 20){
        //母鸡
        var hen = 0 ;
        while(hen <= 100/3){
            var chicken = 0 ;
            while(chicken <= 100){
                var money = cock * 5 + hen * 3 + chicken / 3 ;
                var mount = cock + hen + chicken ;
                if(money == 100 && mount == 100){
                    println("cock : %d , hen : %d , chicken : %d",cock,hen,chicken) ;
                }
            }
        }
    }

    //for循环
    //to []
    scala>for (x <- 1 to 10){
        println(x) ;
    }

    //until [1,...10)
    scala>for (x <- 1 10){
        println(x) ;
    }

    //scala没有break continue语句。可以使用Breaks对象的break()方法。
    scala>import scala.util.control.Breaks._
    scala>for(x <- 1 to ) {break() ; print(x)} ;


    //for循环高级
    //双循环,守卫条件
    scala>for(i <- 1 to 3 ; j <- 1 to 4 if i != j ) {printf("i = %d, j = %d , res = %d ",i,j,i*j);println()} ;    
    
    //yield,是循环中处理每个元素,产生新集合
    scala>for (x <- 1 to 10 ) yield x % 2 ; 


    //定义函数
    def add(a:Int,b:Int):Int = {
    var c = a + b  ;
    return c  ;
    }

    scala>def add(a:Int,b:Int):Int =    a + b 

    //scala实现递归 n! = n * (n - 1)!
    4!  = 4 x 3!
    4!  = 4 x 3 x 2!
    4!  = 4 x 3 x 2 x 1!
    
    //递归函数必须显式定义返回类型
    scala>def fac(n:Int):Int = if(n ==1 ) 1 else n * fac(n-1) ;


    //函数的默认值和命名参数
    scala>def decorate(prefix:String = "[[",str:String,suffix:String = "]]") = {
        prefix + str + suffix 
    }

    scala>decorate(str="hello")
    scala>decorate(str="hello",prefix="<<")

    //变长参数
    scala>def sum(a:Int*) = {
        var s = 0 ;
        for (x <- a) s += x;
        s
        }

    scala>add(1 to 10)            //wrong
    scala>add(1 to 10:_*)        //将1 to 10当做序列处理。
    scala>def sum(args:Int*):Int = {if (args.length == 0) 0 else args.head + sum(args.tail:_*)}

    //过程,没有返回值,没有=号。
    scala>def out(a:Int){
        println(a) ;
    }

    //lazy延迟计算
    scala>lazy val x = scala.io.Source.fromFile("d:/scala/buy.scala00").mkString()
            x:
            x

    //异常
    scala>
        try{
          "hello".toInt;
        }
        catch{                    //交给
            case _:Exception    => print("xxxx") ;
            case ex:java.io.IOException => print(ex)
        }


_的意义
---------------------
    1.统配相当于*
    2.1 to 10 :_*    ,转成序列
    3.case _:Exception    => print("xxxx") ;

数组(定长)
---------------
    java : int[] arr = int int[4] ;
    scala>var arr = new Array[Int](10);            //apply(10)
    scala>var arr = Array(1,2,3,4,);            //推断
    scala>arr(0)                                //按照下标访问元素

变长数组
-------------------
    scala>import scala.collection.mutable.ArrayBuffer
    scala>val buf = ArrayBuffer[Int]();            //创建数组缓冲区对象

    //+=在末尾追加
    scala>buf += 1

    //操纵集合
    scala>buf ++= ...

    //trimEnd,从末尾移除元素
    scala>buf.trimStart(2)
    scala>buf.trimEnd(2)

    //insert,在0元素位置插入后续数据
    scala>buf.insert(0,1,2)
    
    //remove按照索引移除
    scala>buf.remove(0)

    //toArray
    scala>buf.toArray

    //数组操作
    scala>for (x <- 1 to 10 if x % 2 ==0) yield x * 2    //
    scala>var a = Array(1 to 10)

    //数组常用方法
    scala>arr.sum
    scala>arr.min
    scala>arr.max

    
    //排序
    scala>import scala.util.Sorting._
    scala>val arr = Array(1,4,3,2)
    scala>quickSort(arr)                //arr有序

    //Array.mkString
    scala>arr.mkString("<<",",",">>")    //<<1,2,3,4>>

    //多维数组
    scala>var arr:Array[Int] =new Array[Int](4);
    //二维数组,3行4列
    scala>val arr = Array.ofDim[Int](3,4)
    //下标访问数组元素
    scala>arr(0)(1)
    scala>arr.length


    //和java对象交互,导入转换类型,使用的隐式转换
    scala>import scala.collection.JavaConversions.bufferAsJavaList
    scala>val buf = ArrayBuffer(1,2,3,4);
    scala>val list:java.util.List[Int] = buf ;


    //映射和元组
    //key->value
    //scala.collection.immutable.Map[Int,String] =不可变集合
    scala>val map = Map(100->"tom",200->"tomas",300->"tomasLee")
    //通过key访问value
    scala>map(100)
    scala>val newmap = map + (4->"ttt")
    
    //可变
    scala>val map = new scala.collection.mutable.HashMap[Int,Int]
    scala>val map = scala.collection.mutable.HashMap[Int,Int]()
    scala>map += (1->100,2->200)    //追加
    scala>map -= 8                    //移除元素

    //迭代map
    scala>for ((k,v)<- map) println(k + ":::" + v);

    //使用yield操作进行倒排序(kv对调),
    scala>for ((k,v)<- map) yield (v,k);

    //元组tuple,元数最多22-->Tuple22
    scala>val t = (1,"tom",12) ;

    //访问元组指定元
    scala>t._2
    scala>t _2
    //直接取出元组中的各分量
    scala>val (a,b,c) = t        //a=1,b="tom",c=12
    
    //数组的zip,
    //西门庆 -> 潘金莲  牛郎 -> 侄女  ,
    scala>val hus = Array(1,2,3);
    scala>val wife = Array(4,5,6);
    scala>hus.zip(wife)        //(1,4),(2,5),(3,6)


OOP
----------------
    scala>class Person{
        //定义变量,私有类型,必须初始化
        //set/get也私有
        private var id = 0 ;
        
        //只有get方法,没有set方法
        val age = 100 ;

        //生成私有属性,和共有的get/set方法。
        var name = "tom" ;
        //默认public
        def incre(a:Int) = {id += a ;}
        //如果定义时,没有(),调用就不能加()
        def current() = id 
    }

    scala>var p = new Person();
    scala>p.current()
    scala>p.current
    scala>p.incr(100)
    scala>p.name
    scala>p.name_=("kkkk")
    scala>p.name = "kkkk"


private[this]作用,控制成员只能在自己的对象中访问。
-------------------
    class Counter{
        private[this] var value =  0 ;
        def incre(n:Int){value += n}

        def isLess(other:Counter) = value < other.value ;
    }

定义BeanProperty注解
----------------------
    class Person{
        @scala.reflect.BeanProperty
        var  name:String  = _
    }


构造函数
----------------
    主构造器        //
    辅助构造        //
    
    class Person{
        var id = 1 ;
        var name = "tom" ;
        var age = 12;

        //辅助构造
        def this(name:String){
            this();
            this.name = name ;
        }
        //辅助构造
        def this(name:String,age:Int){
            //调用辅助构造
            this(name) ;
            this.age = age ;
        }
    }

    
    //主构造
    //val ===> 只读
    //var ==> get/set
    //none ==> none
    class Person(val name:String,var age:Int , id :Int){
        
        def hello() = println(id)
    }


Object
-----------------
    说明:scala没有静态的概念,如果需要定义静态成员,可以通过object实现。
          编译完成后,会生成对应的类,方法都是静态方法,非静态成员对应到单例类中
          单例类以Util$作为类名称。

    scala>object Util{
        //单例类中.(Util$)
        private var brand = "benz" ;
        //静态方法.
        def hello() = println("hello world");
    }

伴生对象(companions object)
--------------------------
    类名和object名称相同,而且必须在一个scala文件中定义。
    class Car{
        def stop() = println("stop....")
    }

    object Car{
        def run() = println("run...")
    }

抽象类
--------------
    //定义抽象类
    abstract class Dog{
        def a():Unit
    }


object等价于java中的静态。
---------------------------
    object Jing8 extends Dog{
        //重写方法
        override def a():Unit= print("hello") ;
    }

object Util{
    def apply(s:String) = println(s) ;
}

Util("hello world");
Util.apply("hello world");

trait
----------
    特质,等价于java中的接口.


scalac编译scala文件,产生class文件。
------------------------------------
    cmd>scalac xxxx.scala

运行class程序
--------------------
    cmd>scala Person

一步到位
-------------------
    cmd>scala Person.scala

idea中安装scala插件
------------------------

trait
-----------
    traint HelloService{
    }


//包对象,编译完之后生成以xxx为package,下面含有类package.class + package.class
package object xxxx{

}


//约束可见性。
-----------------------
private[package|this]

导入
--------------
import java.io.Exception
import java.io.{A,B,C}            //
import java.io.{A => A0}        //别名

你可能感兴趣的:(编程,Scala)