目录
- [1. Scala简介](#1. Scala简介)
- [2. Scala编写的Hello World](#2. Scala编写的Hello World)
-
- [2.1 pom.xml中依赖和插件的配置](#2.1 pom.xml中依赖和插件的配置)
- [2.2 安装Scala2.12.17](#2.2 安装Scala2.12.17)
- [2.3 安装code-server插件](#2.3 安装code-server插件)
- [2.4 helloworld.scala](#2.4 helloworld.scala)
- [2.5 helloworld2.scala](#2.5 helloworld2.scala)
- [2.6 java调用scala object](#2.6 java调用scala object)
- [3. Scala调用Java](#3. Scala调用Java)
-
- [3.1 例子1](#3.1 例子1)
- [3.2 例子2](#3.2 例子2)
- 参考
1. Scala简介
Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言,并集成面向对象编程和函数式编程的各种特性。
Scala具备如下的核心特征:
1. Scala中的每个值都是一个对象,包含基本数据类型在内,连函数也是对象。
2. 与只支持单继承的语言相比,Scala具有更广泛意义上的类重用。Scala允许定义新类的时候重用"一个类中新增的成员定义"。
3. Scala还包含若干函数式语言的关键概念,包括高阶函数、局部套用、嵌套函数、序列解读等。
4. Scala是静态类型的,这就允许它提供泛型类、内部类,甚至多态方法。
Scala可以与Java互操作,用scalac这个编译器把源文件编译成Java的class文件,可以从Scala中调用所有的Java类库,可同样可以从Java应用程序中调用Scala的代码。
2. Scala编写的Hello World
2.1 pom.xml中依赖和插件的配置
xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
<version>2.12.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>add-scala-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src/main/scala</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>4.8.0</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
2.2 安装Scala2.12.17
命令:
bash
cd ~
wget https://downloads.lightbend.com/scala/2.12.17/scala-2.12.17.deb
apt install ./scala-2.12.17.deb -y
2.3 安装code-server插件
安装Scala(Metals)和Scala Syntax,等待插件自动下载Metals,即可直接在.scala文件中运行代码。
2.4 helloworld.scala
object语句在定义了一个叫helloworld的类的同时还定义了一个叫helloworld的实例。这个实例在第一次使用时会进行实例化。这个类通过main函数来接受命令行参数(String数组),并且返回Unit(等价于void)。main函数没有使用static修饰符,是因为Scala从不定义静态成员,而通过定义object取而代之。
scala
object helloworld {
def main(args : Array[String]) : Unit = {
println("Hello, World!")
}
}
直接点击Scala代码文件中的run即可运行。
2.5 helloworld2.scala
scala
object helloworld2 {
def greet() : Unit = {
println("Hello, World!")
}
}
2.6 java调用scala object
java
public class App
{
public static void main( String[] args )
{
helloworld2$.MODULE$.greet();
}
}
运行命令:
bash
mvn clean install
java -cp "./target/scala-simple-usage-1.0.jar:/usr/share/scala/lib/scala-library.jar" com.mengsui.App

3. Scala调用Java
Scala的另一个强项在于可以简单地与已有的Java代码交互,所有Java.lang中的类都已经被自动导入,而其他的类需要显式声明导入。
3.1 例子1
Scala的import语句可以使用大括号来导入同一个包里的多个类。当导入一个包中的所有类或者符号时,需要使用下划线,这是由于*在Scala中是一个有效的标识符。
在Scala中,只有一个参数的函数可以用df format now
来替代df.format(now)
。Scala中可以直接继承或者实现Java中的接口和类。
scala
import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
object FrenchDate {
def main(args : Array[String]) : Unit = {
val now = new Date
val df = getDateInstance(LONG, Locale.FRANCE)
println(df format now)
}
}

3.2 例子2
Scala是一个纯面向对象的语言,数字和函数都是对象。下面的oncePerSecond接受一个回调函数作为参数,这个回调函数既不接受参数也没有任何返回。main中使用了一个匿名函数() => println("...")
来作为oncePerSecond的参数,该匿名函数没有任何参数,并且用=>将参数列表和代码分开。
scala
object Timer {
def oncePerSecond(callback: () => Unit) {
while (true) {
callback()
Thread sleep 1000
}
}
def main(args : Array[String]) : Unit = {
oncePerSecond(() => println("time files like an arrow..."))
}
}

参考
吴章勇 杨强著 大数据Hadoop3.X分布式处理实战