Scala的初步使用

目录

  • [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分布式处理实战

相关推荐
十年之少17 分钟前
内存检测工具——Qt Creator
开发语言·qt
AI小智41 分钟前
MCP:昙花一现还是未来标准?LangChain 创始人激辩实录
后端
bobz96543 分钟前
strongswan IKEv1 proposal 使用
后端
网络安全(king)43 分钟前
基于java社交网络安全的知识图谱的构建与实现
开发语言·网络·深度学习·安全·web安全·php
论迹1 小时前
【二分算法】-- 三种二分模板总结
java·开发语言·算法·leetcode
Sans_1 小时前
初识Docker-Compose(包含示例)
后端·docker·容器
信阳农夫1 小时前
Django解析跨域问题
后端·python·django
小华同学ai1 小时前
331K star!福利来啦,搞定所有API开发需求,这个开源神器绝了!
前端·后端·github
五花肉村长1 小时前
Linux-基础开发工具
linux·运维·服务器·开发语言·c++·visualstudio
hyena2 小时前
基于FastExcel/EasyExcel多线程导出百万级数据Excel文件并利用 ResponseBodyEmitter 与caffeine技术实现进度查询
后端