• 【博学谷学习记录】超强总结,用心分享丨大数据从0到1落地(一):Scala基础语法


    大数据开发基础

       学习编程语言往往是我们开启学习之路的第一大步。大数据领域的很多框架都是基于Java语言开发的,而且各种框架也都提供了Java API来提供使用和操作接口,所以Java语言的学习逃不掉。除此之外Scala在必要时也可以学一下,在大数据开发领域里用得还是挺多的。Scala语言的表达能力很强,代码信噪比很高,而且很多大数据框架也都提供了Scala语言的开发接口,况且Scala也可以运行于Java平台(JVM),并且兼容Java程序,所以也可以和大数据相关系统进行很好的集成。


    前言

      Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
    特点

    • 同样运行在JVM上,可以与现存程序同时运行。
    • 可直接使用Java类库。
    • 同Java一样静态类型。
    • 语法和Java类似,比Java更加简洁(简洁而并不是简单),表达性更强。
    • 同时支持面向对象、函数式编程。
    • 比Java更面向对象。

    一、环境配置

      Scala需要依赖Java,访问链接: Scala和jdk对应关系
      Windows中下载安装配置环境变量:

    • 类似于java配置SCALA_HOME为安装目录。
    • 添加%SCALA_HOME%\bin到path环境变量。

      Linux中类似,可以使用包管理器,但如果依赖版本不严格一致的话,需要官网下载对应版本安装即可。
    IDEA 环境配置
    使用IntelliJ IDEA:

    1. 创建Maven项目,JDK版本8。
    2. 安装插件:Scala。一般默认都已经装了。
    3. Maven项目默认用Java写,在main/目录下新建目录scala/,然后将目录标记为Source Root。
    4. 这样甚至可以在同一个项目中混用Scala和Java源文件,并互相调用。
    5. 需要能够添加scala源文件,右键项目,添加框架支持,配置Scala SDK,选择,然后就可以右键添加Scala源文件了。
    6. 添加包,添加Scala类,选择对象,编辑源码。

    package VeryStarted

    package VeryStarted
    
    object HelloWorld {
      def main(args: Array[String]): Unit= {
        println("Hello,world!")
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    语法含义:

    object SingletonObject { body }
    def MethodName(ArgName: ArgType): RetType = { body }
    
    • 1
    • 2

      object关键字创建的伴生对象,可以理解为替代Java的static关键字的方式,将静态方法用单例对象的实例方法做了替代,做到了更纯粹的面向对象。
      再用一个等价的类定义来认识和区别一下Scala和Java:
    java

    public class Student {
        private String name;
        private Integer age;
        private static String school = "XDU";
    
        public Student(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public void printInfo() {
            System.out.println(this.name + " " + this.age + " " + Student.school);
        }
    
        // psvm
        public static void main(String[] args) {
            Student tch = new Student("tch", 20);
            tch.printInfo();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    Scala

    package VeryStarted
    
    class Student(name: String, age: Int) {
      def printInfo(): Unit = {
        println(name + " " + age + " " + Student.school)
      }
    }
    
    // 引入伴生对象,名称一致,同一个文件
    object Student {
      val school: String = "XDU"
    
      def main(args: Array[String]): Unit = {
        val tch = new Student("tch", 20)
        tch.printInfo()
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二 变量与数据类型

    注释:

    • 和java一样
    • // 单行
    • /* */ 多行
    • /** */ 文档,方法或者类前面,便于scaladoc生成文档。

    变量和常量

    var name [:VariableType] = value // variable
    val name [:ConstantType] = value // constant
    
    • 1
    • 2

      因为Scala的函数式编程要素,所以一个指导意见就是能用常量就不要用变量。

    • 声明变量时,类型可以省略,编译器会自动推导。
    • 静态类型,类型经过给定或推导确定后就不能修改。
    • 变量和常量声明时,必须有初始值。
    • 变量可变,常量不可变。
    • 引用类型常量,不能改变常量指向的对象,可以改变对象的字段。
    • 不以;作为语句结尾,scala编译器自动识别语句结尾。

    标识符命名规范

    • 字母下划线开头,后跟字母数字下划线,和C/C++/Java一样。
    • 操作符开头,且只包含(±*/#!等),也是有效的标识符。这样用会用什么奇怪的好处吗?答案是灵活到天顶星的运算符重载。
    • 用反引号包括的任意字符串,即使是同39个Scala关键字同名也可以。有点奇怪的用法,尚不知道为什么。

    关键字

    • package import class obejct trait extends with type for
    • private protected abstract sealed final implicit lazy override try
      catch finlly throw
    • if else match case do while for return yield
    • def var val
    • this super
    • new
    • true false null
    • 其中Java没有的关键字:object trait with implicit match yield def val var

    字符串

    • 类型:String
    • +号连接
    • *字符串乘法,复制一个字符串多次
    • printf格式化输出
    • 字符串插值:s"xxx¥{varname}"前缀s模板字符串,前缀f格式化模板字符串,通过$获取变量值,%后跟格式化字符串。
    • 原始字符串:raw"rawstringcontents${var}",不会考虑后跟的格式化字符串。
    • 多行字符串:“”" “”"。
    • 输出:print printf println …

    数据类型

    • java中不是纯粹的面向对象。Scala吸取了这一点,所有数据都是对象,都是Any的子类。
    • Any有两个子类:AnyVal值类型 AnyRef引用类型。
    • 数值类型都是AnyVal子类,和Java数值包装类型都一样,只有整数在scala中是Int、字符是Char有点区别。
    • StringOps是java中String类增强,AnyVal子类。
    • Unit对应java中的void,AnyVal子类。用于方法返回值的位置,表示方法无返回值,Unit是一个类型,只有一个单例的对象,转成字符串打印出来为()。
    • Void不是数据类型,只是一个关键字。
    • Null是一个类型,只有一个单例对象null就是空引用,所有引用类型AnyRef的子类,这个类型主要用途是与其他JVM语言互操作,几乎不在Scala代码中使用。
    • Nothing所有类型的子类型,也称为底部类型。它常见的用途是发出终止信号,例如抛出异常、程序退出或无限循环。
      整数类型:都是有符号整数,标准补码表示。
    • Byte 1字节
    • Short 2字节
    • Int 4字节
    • Long 8字节

      整数赋初值超出表示范围报错。
      自动类型推断,整数字面值默认类型Int,长整型字面值必须加L后缀表示。
      直接向下转换会失败,需要使用强制类型转换,(a + 10).toByte。

    空类型:

    • Unit 无值,只有一个实例,用于函数返回值。
    • Null 只有一个实例null,空引用。
    • Nothing 确定没有正常的返回值,可以用Nothing来指定返回值类型。好像意思是抛异常时返回Nothing,不是特别懂

  • 相关阅读:
    springboot+vue实现excel的导出
    go垃圾回收
    视频汇聚EasyCVR视频监控云平台对接GA/T 1400视图库对象和对象集合XMLSchema描述
    浅谈 JVM GC 收集器--系列(一)
    openGauss学习笔记-79 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT应用场景
    《乔布斯传》英文原著重点词汇笔记(二)【 chapter one】
    Redis 集群模式
    K8s之DashBoard
    GitHub无法访问的解决方法
    使用c#强大的表达式树实现对象的深克隆之解决循环引用的问题
  • 原文地址:https://blog.csdn.net/Mrxuchen/article/details/125468816