Scala(一)

Scala入门

概述

什么是Scala

从英文的角度来讲,Scala并不是一个单词,而是Scalable Language两个单词的缩写,表示可伸缩语言的意思。从计算机的角度来讲,Scala是一门完整的软件编程语言,那么连在一起就表示Scala是一门可伸缩的软件编程语言。之所以说它是可伸缩,是因为这门语言体现了面向对象,函数式编程等多种不同的语言范式,且融合了不同语言新的特性。

Scala编程语言是由联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel的工作开始设计并开发的。由于Martin Odersky之前的工作是开发通用Java和Javac(Sun公司的Java编译器),所以基于Java平台的Scala语言于2003年底/2004年初发布。
截至到2020年4月,Scala最新版本为2.13.1,支持JVM和JavaScript

Scala官网:https://www.scala-lang.org/

为什么学习Scala

在之前的学习中,我们已经学习了很长时间的Java语言,为什么此时要学习一门新的语言呢?主要基于以下几个原因:

  1. 大数据主要的批处理计算引擎框架Spark是基于Scala语言开发的
  2. 大数据主要的流式计算引擎框架Flink也提供了Scala相应的API
  3. 大数据领域中函数式编程的开发效率更高,更直观,更容易理解

Java and Scala

Martin Odersky是狂热的编译器爱好者,长时间的编程后,希望开发一种语言,能够让写程序的过程变得简单,高效,所以当接触到Java语言后,感受到了这门语言的魅力,决定将函数式编程语言的特性融合到Java语言中,由此产生了2门语言(Pizza & Scala),这两种语言极大地推动了Java语言的发展

  1. JDK1.5的泛型,增强for循环,自动类型转换等都是从Pizza语言引入的新特性
  2. JDK1.8的类型推断,λ(lambda)表达式是从Scala语言引入的新特性

由上可知,Scala语言是基于Java开发的,所以其编译后的文件也是字节码文件,并可以运行在JVM中。
在这里插入图片描述

快速上手

Scala环境安装

  1. 安装JDK 1.8(略)

  2. 安装Scala2.12
     解压文件:scala-2.12.11.zip,解压目录要求无中文无空格
     配置环境变量
    在这里插入图片描述

  3. 环境测试
    如果出现如下窗口内容,表示环境安装成功
    在这里插入图片描述

Scala插件安装

默认情况下IDEA不支持Scala的开发,需要安装Scala插件。
在这里插入图片描述
如果下载慢的,请访问网址:https://plugins.jetbrains.com/plugin/1347-scala/versions

变量和数据类型

变量

变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数或者字母。

语法声明

变量的类型在变量名之后等号之前声明。

object ScalaVariable {
    def main(args: Array[String]): Unit = {
        // var | val 变量名 :变量类型 = 变量值
        // 用户名称
        var username : String = "zhangsan"
        // 用户密码
        val userpswd : String = "000000" 
    }
}

变量的类型如果能够通过变量值推断出来,那么可以省略类型声明,这里的省略,并不是不声明,而是由Scala编译器在编译时自动声明编译的。

object ScalaVariable {
    def main(args: Array[String]): Unit = {
        // 因为变量值为字符串,又因为Scala是静态类型语言,所以即使不声明类型
        // Scala也能在编译时正确的判断出变量的类型,这体现了Scala语言的简洁特性。
        var username = "zhangsan"
        val userpswd = "000000" 
    }
}

变量初始化

Java语法中变量在使用前进行初始化就可以,但是Scala语法中是不允许的,必须显示进行初始化操作。

object ScalaVariable {
    def main(args: Array[String]): Unit = {
        var username // Error
        val username = "zhangsan" // OK
    }
}

可变变量

值可以改变的变量,称之为可变变量,但是变量类型无法发生改变, Scala中可变变量使用关键字var进行声明

object ScalaVariable {
    def main(args: Array[String]): Unit = {
        // 用户名称
        var username : String = "zhangsan"
        username = "lisi" // OK
        username = true // Error
    }
}

不可变变量

值一旦初始化后无法改变的变量,称之为不可变变量。Scala中不可变变量使用关键字val进行声明, 类似于Java语言中的final关键字

object ScalaVariable {
    def main(args: Array[String]): Unit = {
        // 用户名称
        val username : String = "zhangsan"
        username = "lisi" // Error
        username = true // Error
    }
}

字符串

在 Scala 中,字符串的类型实际上就是 Java中的 String类,它本身是没有 String 类的。

在 Scala 中,String 是一个不可变的字符串对象,所以该对象不可被修改。这就意味着你如果修改字符串就会产生一个新的字符串对象。

object ScalaString {
    def main(args: Array[String]): Unit = {
        val name : String = "scala"
        val subname : String = name.substring(0,2)
    }
}

字符串连接

object ScalaString {
    def main(args: Array[String]): Unit = {
        // 字符串连接
        println("Hello " + name)
    }
}

传值字符串

object ScalaString {
    def main(args: Array[String]): Unit = {
        // 传值字符串(格式化字符串)
        printf("name=%s\n", name)
    }
}

插值字符串

object ScalaString {
    def main(args: Array[String]): Unit = {
        // 插值字符串
        // 将变量值插入到字符串
        println(s"name=${name}")
    }
}

多行字符串

object ScalaString {
    def main(args: Array[String]): Unit = {
        // 多行格式化字符串
        // 在封装JSON或SQL时比较常用
        // | 默认顶格符
        println(
                    s"""
                      | Hello
                      | ${name}
        """.stripMargin)
    }
}

输入输出

输入

  1. 从控制台中获取输入
object ScalaIn {
    def main(args: Array[String]): Unit = {
        // 标准化屏幕输入
        val age : Int = scala.io.StdIn.readInt()
        println(age)
}
}
  1. 从文件中获取输入
object ScalaIn {
def main(args: Array[String]): Unit = {
    // 请注意文件路径的位置
        scala.io.Source.fromFile("input/user.json").foreach(
            line => {
                print(line)
            }
        )
		scala.io.Source.fromFile("input/user.json").getLines()
	}
}

输出

Scala进行文件写操作,用的都是java中的I/O类

object ScalaOut {
    def main(args: Array[String]): Unit = {
      val writer = new PrintWriter(new File("output/test.txt" ))
      writer.write("Hello Scala")
      writer.close()
	}
}

网络

Scala进行网络数据交互时,采用的也依然时java中的I/O类

object TestServer {
    def main(args: Array[String]): Unit = {
        val server = new ServerSocket(9999)
        while ( true ) {
            val socket: Socket = server.accept()
            val reader = new BufferedReader(
                new InputStreamReader(
                    socket.getInputStream,
                    "UTF-8"
                )
            )
            var s : String = ""
            var flg = true
            while ( flg  ) {
                s = reader.readLine()
                if ( s != null ) {
                    println(s)
                } else {
                    flg = false
                }
            }
        }
    }
}

...

object TestClient {
    def main(args: Array[String]): Unit = {
        val client = new Socket("localhost", 9999)
        val out = new PrintWriter(
            new OutputStreamWriter(
                client.getOutputStream,
                "UTF-8"
            )
        )
        out.print("hello Scala")
        out.flush()
        out.close()
        client.close()
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值