zoukankan      html  css  js  c++  java
  • 从零学scala(一)基础、控制结构和函数

    平时使用Spark比较多,但是对于scala的学习只限于看过书、能写代码,从来没有系统的学习过。此次看《快学scala》,做读书笔记,算是从头学习一下。
    《快学scala》pdf书百度云地址:https://pan.baidu.com/s/1Bv-k08wffXpnkzCymnYe8w

    一:基础

    变量和常量

            val age = 10;    //生成一个常量,推荐使用常量,缺点不可变
            var name,classId = "100";   //生成两个变量name,classid 同时赋值为100

            val name,classId :String = 100   //声明变量的同时声明变量的类型,可以不声明,由scala推导得出

    常用类型

            Byte、Char、Short、Int、long、Float、Double、Boolean、BigInt、BigDecimal

    算术和运算符的重载

            val data = 1.+(2) 类似这种的写法,个人感觉:大部分都是Java转过来的,所以还是尽量使用 val data = 1 + 2

    调用方法和函数

            Scala中调用方法和函数的差别是:scala中可能不需要加上前面的类

            例如:pow(2,4)  但是前提是你需要使用   import scala.math._

    apply方法

            apply方法在不同对象调用的时候是不同方法的:

            例如:  val data = “123456”.apply(2)   //结果3        String 方法就是获取对应位置的字符:

            val age = Array.apply(1,2,3,4)               //数组方法就是初始化值为数组的内容

    二:控制接口和函数

    条件表达式

            val data = if(1 > 2) "aa" else 12        //假如条件表达式成立的话返回字符串,否则的话返回数字

            如果if后面的语句很长的话,用{}括起来,不能换行,会报错

    终止语句

            scala中;不是必须的。所以可以省略不写,但是如果一行有两条语句的话是必须写的。

            如果语句过长,可以使用 \ 告诉编辑器还没有结束

     块表达式和赋值

            scala中可以将一整块的代码最终的结果赋值给一个变量或者常量。

            例如:val data = {val i = 10;   val j = 14;   scala.math.pow(i,j)}

     输入和输出

            输出比较常用,直说输出:

            print(data)    //不换行打印

            println(data)    //换行打印

            printf("aa %s bb cc %d dd ee","aa",42 )   //C语言格式的打印

     循环

            var i =10
            while(i > 0){
                    println(i)
                    i -= 1
            }  //while循环

            

            for(i <- 1 to 10)
                    println(i)  //1到10的循环(1和10都有的)

            for(i <- 1 until 10)
                    println(i)  //1到10的循环(1有、10没有)

     高级for循环和for推导式

            双层for循环:

            for(i <- 1 to 3 ; j <- 5 to 7 )
                    println(i * j)   //输出结果9个 :5 6 7 10 12 14 15 18 21 

            双层for循环+条件表达式:

            for(i <- 1 to 3 ; j <- 1 to 3 if i != j)

                    print(i * j + " ")   //输出结果6个:2 3 2 6 3 6 

            双层for循环的另一类写法:

            for(i <- 1 to 3 ; data = 4 -i ; j <- data to 3)
                    print(i +" "+ j + "|")      //输出结果6个:1 3|2 2|2 3|3 1|3 2|3 3|

            //循环生成数组内容

            val data = for(i <- 1 to 3 ) yield i    //Vector(1, 2, 3)

     函数

            def fac() = {
                    var data = 1
                    for(i <- 1 to 10) data = data.*(i)
                            data
            }  //将1到10的数字相乘作为函数的返回值。可以不用现实的写return,默认最后一个表达式就是返回值。

            递归函数必须要有返回值的标识,否则编辑器会报错

            def fac(n:Int):Int = {
                    if(n > 0) n*fac(n-1) else 1
            }

     默认参数和带名参数

            def decorate(left:String="[",right:String="]") = {
                    println(left + "|" + right)
            }   //函数有两个默认参数:left和right,有默认值“[”“]”

            调用的时候可以只写一个参数:

            decorate("a")  //默认是第一个参数接收,也可以规定接收的参数

            decorate(right = "a")        //第二个参数接收字符串

    变长参数

            def decorate(left:Int *) = {
                    for(i <- left) println(i)
            }    //参数是可变的,这点和Java一致的

            //调用方法的时候,可以传递一个数组,但是需要后加上  :_ *

            decorate(1 to 10: _*)

    过程

            过程其实就是方法,只不过没有 =  

            def decorate(left:Int *) {
                    for(i <- left) println(i)
            }

    懒值

            lazy val aa = Source.fromURL("https://www.baidu.com/index.php").mkString("|")

            //值aa等到使用的时候才会去加载。但是每次访问的时候都需要检测一下该值是否被初始化,慎重使用

    异常

            try{
                    val file = new File("D:\JAVA\data\13.txt")
            }catch{
                    case ex:FileNotFoundException => println("file not found")
                    case ex:Exception => println("Exception")
            }finally{
                    println("close mem")
            }

  • 相关阅读:
    linux mysql添加用户
    linux mysql为root用户初始化密码和改变root密码
    linux pts/0的含义
    mysql查看表的结构
    linux踢人命令 pkill踢人用法
    linux查看在线用户 who命令参数及用法
    linux mysql数据库安装(tar.gz)
    vue app外卖(5) 使用swiper 进行图片轮播
    element-UI 点击一行,背景色变化
    vue 外卖app(3) 利用slot分发内容
  • 原文地址:https://www.cnblogs.com/wuxiaolong4/p/11816184.html
Copyright © 2011-2022 走看看