• 大数据笔记(二十三)——Scala语言基础


    一.Scala简介:一种多范式的编程语言

    (*)面向对象
    (*)函数式编程:Scala的最大特点
    (*)基于JVM

    二.Scala的运行环境

    (1)命令行:REPL
    进入: scala
    退出::quit
    (*) paste 模式: 相当于vi编辑器
    进入: :paste
    退出: ctrl+D

    (2)IDEA
    (*) 默认:没有Scala的环境
    (*) 需要安装插件:SBT(需要联网,有点慢)

    (3)Scala IDE:基于Eclipse

    3、数据的类型:基本数据类型
    注意:(*)在Scala中,任何数据都是对象
    举例:1 是一个对象,就有方法(函数)
    scala> 1.toString
    res0: String = 1 ====> 定义一个新的变量 res0;类型:String

    (*)在定义变量的时候,可以不指定类型
    Scala会进行类型的推导
    以下两句话等价

    val a:Int = 10
    val b = 10


    (1)数值类型: Byte、Short、Int、Long、 Float、 Double
    Byte:8位的有符号数字 -128 ~ 127
    Short: 16的有符号数字 -32768 ~ 32767
    Int 32位
    Long 64位

    (2)字符串:字符和字符串 Char String
    (*)在Scala中,对字符串有一个特殊操作:插值操作 ---> 前面有一个s

    val s1="Hello World"


    在下面的字符串中引用上面的s1

    s"My name is ${s1}"

    (3)Unit类型: 相当于Java中void
    举例:val f = () 相当于我们定义了一个函数,并且把该函数的值付给一个变量f来保存

    (4)Nothing类型: 一般来说,表示在执行的过程中产生了Exception
    举例:定义函数 def
    def myfunction = throw new Exception("Some Error....")

    4、变量和常量
    (*)val和var定义
    (*)val 常量
            var 变量

    5、函数(重要):头等公民
    (1)内置函数
    举例:求最大值 max函数

    max(10,20)

    (2)自定义函数: 关键字def
    举例: 求和

    def sum(x:Int,y:Int):Int = x + y

    也等价于下面的语句

    def sum(x:Int,y:Int):Int = {
    x+y    
    }

    注意:返回值不写return关键字,因为Scala中,函数的最后一句话就是函数的返回值

    复杂一点的例子:求数的阶乘(递归)
    //定义函数求数的阶乘

    def myFactor(x:Int):Int = {
    if(x <= 1)
    1
    else
    x * myFactor(x-1)
    }

    //调用

    myFactor(5)

    6、条件判断: 在Scala中,if...else 是一个表达式,就有表达式的值
    循环: for、while、do..while
    还可以使用foreach进行迭代
    7、函数的参数: 函数参数值的求值策略(call by value、 call by name)

    (1)函数参数值的求值策略、
    call by value:对函数的实参求值,仅求一次
    举例:使用 :

    def test1(x:Int,y:Int):Int = x + x

    调用: 

    test1(3+4,8)

    call by name:函数的实参每次在函数体内部被调用到的时候 都会求值
    举例:使用 : =>

    def test2(x: => Int,y: => Int):Int = x + x

    调用: 

    test2(3+4,8)


    注意:执行的过程是不一样的


    稍微复杂一点的例子:
    x是call by value,y是call by name

    def bar(x:Int,y: => Int):Int = 1

    定义一个死循环

    def loop():Int = loop

    调用:

    bar(1,loop) //输出1
    bar(loop,1) //死循环

    (2)函数的参数
    (*)默认参数

    def func1(name:String="Tom"):String = "Hello " + name

    调用

    func1()

    (*)代名参数:参数多的时候区分是哪一个

    def func2(str:String="Good Morning ", name:String="Tom",age:Int=20):String
    =
    str + name + " and the age of " + name + " is " + age

    调用

    func2()
    func2(age=25)

    (*)可变参数: 求多个数字的和:*表示可变

    def sum(args:Int*) = {
    | var result = 0
    | for(arg <- args) result += arg
    | result
    | }

    scala> 

    sum(1,2,3)

    8、懒值(lazy值)

    如果一个变量是lazy,他的初始化会被推迟,直到第一次使用他的时候
    举例:

    scala> val x:Int =10
    x: Int = 10
    
    scala> val y:Int = x + 10
    y: Int = 20
    
    scala> lazy val z:Int = x + 10
    z: Int = <lazy>
    
    scala> z
    res7: Int = 20

    9、异常:类似Java
    10、数组、映射、元组

    (*)数组二维数组:通过数组的数组来实现
    (*)映射:就是一个<key,value>的Map集合
    (*)元组: Tuple
    (*)是不同类型的值的集合

    val a1 = (1,2,3,"Hello") ===> 类型:Tuple4[Int, Int, Int, String]
    
    val a2 = new Tuple4(1,2,3,"Hello") :4个元素。个数必须匹配

    使用 _下划线来引用元组中的元素

    a2._1
    a2._2
    a2._3
    a2._4

    遍历元组: 首先需要得到元组的迭代器

    a2.productIterator.foreach(println)

  • 相关阅读:
    序列化结构体字段顺序 按照结构体的某个字段排序
    《领域驱动设计》:从领域视角深入仓储(Repository)的设计和实现
    操作系统上的进程 (最小 Linux; fork, execve 和 exit)
    PPM文件格式 Portable Pixmap Format)
    深度 | 字节跳动微服务架构体系演进
    Go 与 C 的桥梁:cgo 入门,剖析与实践
    您的时钟快了 建立私密连接
    os.Exit(123)
    在终端中显示图像
    StampedLock内部是基于CLH锁实现的,CLH是一种自旋锁,能够保证没有“饥饿现象”的发生,并且能够保证FIFO(先进先出)的服务顺序。
  • 原文地址:https://www.cnblogs.com/lingluo2017/p/8672625.html
Copyright © 2020-2023  润新知