什么是Scala
Scala是一门完整的、可伸缩的软件编程高级语言。之所以说它是可伸缩,是因为这门语言体现了面向对象,函数式编程等多种不同的语言范式,且融合了不同语言新的特性。
Scala编程语言是由联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel的工作开始设计并开发的。由于Martin Odersky(马丁·奥德斯基)之前的工作是开发通用Java和Javac(Sun公司的Java编译器),所以基于Java平台的Scala语言于2003年底/2004年初发布。
Scala是基于JVM的语言,与java语言类似,Java语言是基于JVM的面向对象的语言。Scala也是基于JVM,同时支持面向对象和面向函数的编程语言,支持JVM和JavaScript。
为什么学习Scala
大数据主要的批处理计算引擎框架Spark是基于Scala语言开发的
大数据主要的流式计算引擎框架Flink也提供了Scala相应的API
大数据领域中函数式编程的开发效率更高,更直观,更容易理解
扩展:Spark1.6版本中底层基于Scala语言的版本是Scala2.10版本。Spark2.x底层基于的Scala语言版本是Scala2.11版本。Spark3.0底层基于的Scala2.12。
六大特性
- SEAMLESS JAVA INTEROP Java和Scala可以混编
Scala runs on the JVM, so Java and Scala stacks can be freely mixed for totally seamless integration.
Scala 在 JVM 上运行,因此可以自由混合 Java 和 Scala 堆栈以实现完全无缝集成。 - TYPE INFERENCE 类型推测(自动推测类型)
So the type system doesn’t feel so static. Don’t work for the type system. Let the type system work for you!
变量或对象在声明是可以不用指定具体的类型,根据上下文会自动推测出来对应的类型。 - CONCURRENCY & DISTRIBUTION 并发和分布
Use data-parallel operations on collections, use actors for concurrency and distribution, or futures for asynchronous programming.
对集合使用数据并行操作,使用参与者进行并发和分布式开发,或使用异步编程。 - TRAITS 特质、特征
Combine the flexibility of Java-style interfaces with the power of classes. Think principled multiple-inheritance.
将 Java 样式接口的灵活性与类的强大功能相结合。考虑原则性的多重继承,类似java中抽象类。 - PATTERN MATCHING 模式匹配
Think “switch” on steroids. Match against class hierarchies, sequences, and more.
类似于Java中的switch语法,但是scala从语法中补充了更多的功能,可以按照指定的规则对数据或对象进行匹配, 所以功能更加强大。 - HIGHER-ORDER FUNCTIONS 高阶函数
Functions are first-class objects. Compose them with guaranteed type safety. Use them anywhere, pass them to anything.
函数是一流的对象。在保证类型安全的情况下编写它们。在任何地方(比如:变量的值,函数或方法的参数,函数的返回值等)使用它们,将它们传递给任何东西。
Scala环境安装
注意:在安装Scala之前记得把JDK1.8或JDK1.11安装配置好。
检查JDK是否安装配置好,打开cmd(),输入java -version
C:\Users\Administrator>java -version
java version “1.8.0_161”
Java™ SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot™ 64-Bit Server VM (build 25.161-b12, mixed mode)
官网各版本下载网址:https://www.scala-lang.org/download/all.html
scala2.12.15:https://www.scala-lang.org/download/2.12.15.html
下载好后安装:
方式一:双击scala-2.12.15.msi包安装,记住安装的路径。
方式二:解压scala-2.12.15
以上两种方式建议路径都选择为D:\devsoft\scala-2.12.15
配置环境变量
新建SCALA_HOME
注意:这里建议将Scala安装到纯英文没有空格和特殊符号的路径下。避免后期使用Scala版本出现问题。
编辑Path变量,在后面追加如下:%SCALA_HOME%\bin
打开cmd,输入:scala - version 看是否显示版本号,确定是否安装成功
C:\Users\Administrator>scala -version
Scala code runner version 2.12.15 -- Copyright 2002-2021, LAMP/EPFL and Lightbend, Inc.
C:\Users\Administrator>scala
Welcome to Scala 2.12.15 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_161).
Type in expressions for evaluation. Or try :help.
scala> println("hello world")
hello world
IDEA插件安装
默认情况下IDEA不支持Scala的开发,需要IDEA中安装配置Scala插件。
具体操作步骤:
方式一:打开idea,close项目后,点击Plugins,搜索Scala,点击Install安装
方式二:如果IDEA处于打开的某项目中,点击File->Setting
方式三:本地磁盘上插件的安装。点击File->Setting
注意:以上三种方式,在安装后都需要重启IDEA。
如果通过IDEA安装插件太慢,请访问网址进行下载https://plugins.jetbrains.com/plugin/1347-scala/versions,找到适合自己的IDEA版本插件进行下载即可。
可以通过Disable禁用插件,Uninstall卸载插件!
第一个程序
File->New->Project,进入如下界面,来创建Maven项目
添加Scala支持
默认情况,IDEA中创建的Maven项目不支持Scala的开发,需要添加Scala语言的支持。
在main下创建scala文件夹,并标记为sources root
在scala下创建包:cn.itbaizhan.chapter01
在4的包下创建类HelloWorld
package cn.itbaizhan.chapter01
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello World!!")
}
}
第一个程序的简介
package cn.itbaizhan.chapter01
/**package:定义所在的包
* object:声明一个对象,在编译时会被编译成两个字节码文件:HelloWorld2.class和HelloWorld2$.class
*/
object HelloWorld2 {
/**main函数时程序的入口
* def:表示声明函数或方法的关键字
* args:参数 该参数为一个数组,里边方法的String字符串
* Unit:表示没有返回值
*/
def main(args: Array[String]): Unit = {
System.out.println("Hello World1!!")
println("Hello World2!!")
}
}
运行输出:
Hello World1!!
Hello World2!!
将这个类编译后类scalademo\target\classes\cn\itbaizhan\chapter01\HelloWorld2.class转换为java类:
//decompiled from HelloWorld2.class
package cn.itbaizhan.chapter01;
import scala.reflect.ScalaSignature;
@ScalaSignature(
bytes = "....."
)
public final class HelloWorld2 {
public static void main(final String[] args) {
HelloWorld2$.MODULE$.main(var0);
}
}
//decompiled from HelloWorld2$.class
package cn.itbaizhan.chapter01;
import scala.Predef.;
public final class HelloWorld2$ {
public static HelloWorld2$ MODULE$;
static {
new HelloWorld2$();
}
public void main(final String[] args) {
System.out.println("Hello World1!!");
.MODULE$.println("Hello World2!!");
}
private HelloWorld2$() {
MODULE$ = this;
}
}