Scala的变量和数据类型高级篇

举报
WHYBIGDATA 发表于 2023/03/18 09:05:09 2023/03/18
【摘要】 Scala的变量和数据类型高级篇

Scala的变量和数据类型高级篇



写在前面

  • 操作系统:Windows10
  • JDK版本:jdk1.8
  • Maven版本:Maven-3.5.4
  • Scala版本:Scala-2.12.11
  • IDE工具:IntelliJ IDEA 2019.2.3

字符串

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

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

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

字符串连接

使用 + 符号即可拼接字符串

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

传值字符串

%s表示字符串类型

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)
	 }
}

输入输出

输入

  • 从屏幕(控制台)中获取输入

调用scala.io.StdIn的readXXX()方法

object ScalaIn {
    def main(args: Array[String]): Unit = {
        // 标准化屏幕输入
        val age : Int = scala.io.StdIn.readInt()
        println(age)
	 }
}
  • 从文件中获取输入

scala.io.Source.fromFile()方法读取指定文件内容

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()
    }
}

引申问题:java的序列化是怎么回事?

  • java将内存中的对象存储到磁盘文件中,要求对象必须实现可序列化接口。

  • 在网络中想要传递对象,这个对象需要序列化。

数据类型

Scala与Java有着相同的数据类型,但是又有不一样的地方。请看下文:

Java数据类型

Java的数据类型包含基本类型和引用类型

  • 基本类型:byte,short,char,int,long,float,double,boolean

  • 引用类型:Object,数组,字符串,包装类,集合,POJO对象等

Scala数据类型

Scala是完全面向对象的语言,所以不存在基本数据类型的概念,有的只是任意值对象类型(AnyVal)和任意引用对象类型(AnyRef)

1.png


2.png

类型转换

自动类型转化(隐式转换)

请看以下代码

object ScalaDataType {
    def main(args: Array[String]): Unit = {
        val b : Byte = 10
        val s : Short = b
        val i : Int = s
        val lon : Long = i
	 }
}

强制类型转化

  • Java语言
int a = 10
byte b = (byte)a
  • Scala语言
var a : Int = 10
Var b : Byte = a.toByte

基本上Scala的AnyVal类型之间都提供了相应转换的方法。

字符串类型转化

scala是完全面向对象的语言,所有的类型都提供了toString方法,可以直接转换为字符串

lon.toString

任意类型都提供了和字符串进行拼接的方法

val i = 10
val s = "hello " + i

全文结束!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。