Scala(1) 概述
2023-08-09 14:53:19 # Big Data # Scala

1. Scala 概述

1.1 Scala简介

  • Scala —— Java++
    • Scala基于JVM,和Java完全兼容,同样具有跨平台、可移植性好、方便的垃圾回收等特性
    • Scala比Java更加面向对象
    • Scala是一门函数式编程语言
  • Scala更适合大数据的处理

    • Scala对集合类型数据处理有非常好的支持
    • Spark底层用Scala编写
  • Scala和Java的关系

image-20220917012108881

1.2 Scala环境搭建

安装步骤

  1. 已安装jdk1.8

  2. 下载Scala安装文件scala-2.12.16.zip,https://scala-lang.org/download/2.12.16.html

  3. 解压到D:\scala-2.12.16

  4. 配置环境变量

    • 添加SCALA_HOME

      image-20220917013802834

    • Path添加

      image-20220917013709138

测试

cmd中使用Scala计算两数之和

image-20220917014028760

1.3 IDEA安装Scala插件

在插件市场搜索Scala安装

image-20220917014710623

1.4 Hello World

1.4.1 创建项目

创建Scala项目

image-20220917015254262

image-20220917015404188

创建Maven项目

  1. 先正常创建Maven项目即可

  2. 默认下,Maven不支持Scala开发,需要引入Scala框架,在项目上点击右键->Add Framework Support->选择Scala->点击OK

    image-20220917015942718

  3. 创建项目的源文件目录并标记为Sources root

    image-20220917020202555

1.4.2 创建包和类

在scala包下创建包和类

image-20220917020450212

1.4.3 编写代码

输入main快速生成main方法

1
2
3
4
5
6
7
8
object Hello {
def main(args: Array[String]): Unit = {
println("hello world")
System.out.println("hello world")
}
}

// 输出两行hello world

Java中部分代码也可以在Scala中运行

1.5 语法说明

1.5.1 Hello World语法说明

object:关键字,声明一个单例对象(伴生对象)

main方法:从外部可以直接调用执行的方法,定义在object中

定义方法def 方法名称(参数名称: 参数类型): 返回值类型 = { 方法体 }

[]:表示泛型(与Java要区分)

Unit:表示没有返回值(类似Java中的void)

scala中没有public关键字,如果不声明访问权限,那么就是公共的

1.5.2 clss和object说明

Scala是一个完全面向对象的语言,没有静态语法,为了能模仿静态语法,采用伴生对象单例的方式调用方法

Scala无static关键字,由object实现类似静态方法的功能

class关键字和Java中相同,用来定义一个类

伴生对象与类必须同名且在一个文件中,类可以访问伴生对象所有私有属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Student(name: String, age: Int) {
def printInfo(): Unit = {
println(name + " " + age + " " + Student.school)
}

}

// 引入伴生对象
object Student {
val school: String = "NJU"

def main(args: Array[String]): Unit = {
val alice = new Student("alice", 20)
val bob = new Student("bob", 23)

alice.printInfo()
bob.printInfo()
}
}

// alice 20 NJU
// bob 23 NJU

1.5.3 Scala程序反编译

Student.class

入口类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.whale.scalademo;

import scala.Predef$;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes = "\006\001\r3Aa\003\007\001'!A!\004\001B\001B\003%1\004\003\005'\001\t\005\t\025!\003(\021\025Q\003\001\"\001,\021\025\001\004\001\"\0012\017\025)D\002#\0017\r\025YA\002#\0018\021\025Qc\001\"\0019\021\035IdA1A\005\002iBaa\017\004!\002\023Y\002\"\002\037\007\t\003i$aB*uk\022,g\016\036\006\003\0339\t\021b]2bY\006$W-\\8\013\005=\001\022!B<iC2,'\"A\t\002\007\r|Wn\001\001\024\005\001!\002CA\013\031\033\0051\"\"A\f\002\013M\034\027\r\\1\n\005e1\"AB!osJ+g-\001\003oC6,\007C\001\017$\035\ti\022\005\005\002\037-5\tqD\003\002!%\0051AH]8pizJ!A\t\f\002\rA\023X\rZ3g\023\t!SE\001\004TiJLgn\032\006\003EY\t1!Y4f!\t)\002&\003\002*-\t\031\021J\034;\002\rqJg.\033;?)\racf\f\t\003[\001i\021\001\004\005\0065\r\001\ra\007\005\006M\r\001\raJ\001\naJLg\016^%oM>$\022A\r\t\003+MJ!\001\016\f\003\tUs\027\016^\001\b'R,H-\0328u!\tica\005\002\007)Q\ta'\001\004tG\"|w\016\\\013\0027\00591o\0315p_2\004\023\001B7bS:$\"A\r \t\013}R\001\031\001!\002\t\005\024xm\035\t\004+\005[\022B\001\"\027\005\025\t%O]1z\001")
public class Student {
private final String name;

private final int age;

public Student(String name, int age) {}

public void printInfo() {
Predef$.MODULE$.println((new StringBuilder(2))
.append(this.name)
.append(" ")
.append(this.age)
.append(" ")
.append(Student$.MODULE$.school()).toString());
}

public static String school() {
return Student$.MODULE$.school();
}

public static void main(String[] paramArrayOfString) {
Student$.MODULE$.main(paramArrayOfString);
}
}

Student$.class

伴生对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.whale.scalademo;

public final class Student$ {
public static Student$ MODULE$;

private final String school;

public String school() {
return this.school;
}

public void main(String[] args) {
Student alice = new Student("alice", 20);
Student bob = new Student("bob", 23);
alice.printInfo();
bob.printInfo();
}

private Student$() {
MODULE$ = this;
this.school = "NJU";
}
}

1.6 关联源码

  1. 官网下载源代码文件scala-2.12.16.tar.gz

  2. 拷贝到scala-2.12.16\lib下,并解压为文件夹

  3. IDEA中选择Attach Sources,选择该文件夹

image-20220918161000094