跳至主要內容

Scala入门

晨光-向大约 5 分钟ScalaScala语言

Scala入门

Scala官网:The Scala Programming Language (scala-lang.org)open in new window

Scala语言规范.pdfopen in new window 文档

1. 概述

1.1 为什么学习Scala

  • Spark—新一代内存级大数据计算框架,是大数据的重要内容。

  • Spark就是使用Scala编写的。因此为了更好的学习Spark, 需要掌握Scala这门语言。

  • Spark的兴起,带动Scala语言的发展!

1.2 Scala发展史

联邦理工学院的马丁·奥德斯基(Martin Odersky)于2001年开始设计Scala。

马丁·奥德斯基是编译器及编程的狂热爱好者,长时间的编程之后,希望发明一种语言,能够让写程序这样的基础工作变得高效,简单。所以当接触到JAVA语言后,对JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定将函数式编程语言的特点融合到JAVA中,由此发明了两种语言(Pizza & Scala)。Pizza和Scala极大地推动了Java编程语言的发展。

  • JDK5.0 的泛型、增强for循环、自动类型转换等,都是从Pizza引入的新特性。

  • JDK8.0 的类型推断、Lambda表达式就是从Scala引入的特性。

JDK5.0和JDK8.0的编辑器就是马丁·奥德斯基写的,因此马丁·奥德斯基一个人的战斗力抵得上一个Java开发团队。

1.3 Scala和Java 关系

1.4 Scala语言特点

Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言(静态语言需要提前编译的如:Java、c、c++等,动态语言如:js)。

  1. Scala是一门多范式的编程语言,Scala支持面向对象函数式编程。(多范式,就是多种编程方法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法。)

  2. Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有 的Java类库,实现两种语言的无缝对接

  3. Scala单作为一门语言来看,非常的简洁高效

  4. Scala在设计时,马丁·奥德斯基是参考了Java的设计思想,可以说Scala是源于Java,同时马丁·奥 德斯基也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此,对于学习过Java的同学, 只要在学习Scala的过程中,搞清楚Scala和Java相同点和不同点,就可以快速的掌握Scala这门语言。

2. 环境搭建

2.1 文件下载

官网下载地址:All Available Versions | The Scala Programming Language (scala-lang.org)open in new window

2.2 安装

  1. 确保已安装Java8;

    java -version
    
  2. 下载对应的Scala 安装文件 scala-2.12.11.zipopen in new window , 解压到需要安装的目录

  3. 配置环境变量:

    • SCALA_HOME:D:\Develop\Scala\scala-2.12.11
    • 配置%SCALA_HOME%\bin
    • 检查是否配置成功:命令行输入scala, 成功进入scala控制台。

    • 退出控制台::quit

2.3 测试(命令行执行)

  1. 需求:计算两数 a 和b 的和。

步骤:

  • 在键盘上同时按win+r 键,并在运行窗口输入cmd 命令

  • 输入Scala 并按回车键,启动 Scala 环境。然后定义两个变量,并计算求和。

  1. 打印:println()

2.4 Java源文件编写和运行

  1. Java代码:
public class HelloJava {
    public static void main(String[] args) {
        System.out.println("hello java!");
    }
}
  1. 编译字节码 javac
javac HelloJava.java

编译后生成文件 HelloJava.class

  1. 运行
java HelloJava

结果:

hello java!

2.5 Scala源文件编写和运行

  1. scala代码
object HelloScala{
    def main(args: Array[String]):Unit = {
        println("hello scala!");
    }
}

Scala中可以去掉。java不能忽略

  1. 编译字节码:scalac
scalac HelloScala.scala

编译后生成文件 HelloScala.classHelloScala$.class

  1. 运行
scala HelloScala

结果:

hello scala!

2.6 Scala编译结果的反编译深入分析

  1. 使用java的形式来执行编译后的scala字节码文件
  1. 反编译

本次使用反编译工具:jd-gui.exe

HelloScala. 是指:HelloScala$

image-20230613213300885
image-20230613213300885
  1. java形式引用scala环境变量的形式来执行编译后的scala字节码文件
java -cp %SCALA_HOME%/lib/scala-library.jar; HelloScala
image-20230613213550771
image-20230613213550771

3. 在IDE中编写Scala

3.1 创建项目

  1. 创建项目
创建项目
创建项目
  1. Scala插件安装

Settings->Plugins->Marketplace: 搜索 scala

  1. 在main下新建目录scala、配置为Sources Root
  1. 选中当前项目,右键“Add Frameworks Support”(添加框架支持)

3.2 编写项目

  1. 创建目录
  2. 创建scala代码文件
创建Scala文件
创建Scala文件
  1. 编写代码和运行
object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("hello world!")
    // 直接使用java写法
    System.out.println("hello world from java")
  }
}
  1. 代码中的关键字

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

main:从外部可以直接调用执行的方法。

def main(args: Array[String]): Unit = {}:def 方法名称(参数名称:参数类型):返回值类型 =

scala与java参数类型与名称想反。

  1. java: String str
  2. scala:str: Array[String]

Scala完全面向对象,故Scala去掉了Java中非面向对象的元素,如static关键字,void类型

  1. static:Scala无static关键字,由object实现类似静态方法的功能(类名.方法名)。class关键字和Java中的class关键字作用相同,用来定义一个类;

  2. void:对于无返回值的函数,Scala定义其返回值类型为Unit类。

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