Scala编程基础1:基本数据类型、变量、if、for、IO

发布于:2024-05-16 ⋅ 阅读:(95) ⋅ 点赞:(0)

注意:Scala系列的文章需要一定的java基础

Scala底层是用java语言编写的,scala是运行在Java虚拟机(JVM)上的编程语言,它兼容Java,可以直接调用Java的库和框架,并与Java代码无缝集成和互操作。

如果java没有基础的,可以看看在下java专栏的文章^_^,链接如下:

http://t.csdnimg.cn/FkJlt

一、HelloWorld

    /**
     * def:定义函数或者方法的关键字
     * main:函数名 main函数是被jvm(java虚拟机)所特有识别的程序入口
     * args:参数名
     * Array[String]:参数的数据类型
     * Unit:返回值类型 相当于java中的void
     *
     * scala:def main(args: Array[String]): Unit = {}
     * 等价于
     * java:public static void main(String[] args)
     */
object HelloWorld {
  def main(args: Array[String]): Unit = {
    //在scalaz中也可以使用Java语法输出hello world
    System.out.println("hello world")

    //使用scala自己的语法输出hello world
    println("hello world")
  }
}

 注意:

1、scala代码中可以使用Java的类和方法
 2、scala代码中一行语句的结束不需要加分号
 3、class是一个普通的类,不能直接编译运行,object相当于一个单例对象,object类中的方法相当于加上一个static关键字,意味着object类中的方法可以直接调用

参数理解:

def:定义函数或者方法的关键字
main:函数名 main函数是被jvm(java虚拟机)所特有识别的程序入口
args:参数名
Array[String]:参数的数据类型
Unit:返回值类型 相当于java中的void

二、Scala中基本数据类型:

三、Scala中变量的使用

在scala中,可以使用val或者var来定义变量
定义一个变量: var
定义一个常量: val  常量值无法被改变
定义一个变量或常量的标准语法:var/val 变量名:数据类型 = 值
scala提供一种自动数据类型推断机制,数据类型可以省略不写

/**
 * scala与java中基本数据类型:
 * scala:                    java:
 * Byte                      byte
 * Short                     short
 * Int                       int
 * Long                      long
 * Float                     float
 * Double                    double
 * Boolean                   boolean
 * Char                      char
 */
object DataTypes {
  def main(args: Array[String]): Unit = {
    /**
     * 定义一个变量: var
     * 定义一个常量: val  常量值无法被改变
     * 定义一个变量或常量的标准语法:var/val 变量名:数据类型 = 值
     * scala提供一种自动数据类型推断机制,数据类型可以省略不写
     */

    var a1: Int = 19
    a1 = 29
    println(a1)
    //获取数据类型
    println(a1.getClass) //int

    val a2: Double = 19.03
    //a2 = 29  报错原因:常量值无法被改变
    println(a2.getClass)


    /**
     * 字符串:String
     * 1.scala中的String与java中的String指的是同一个,java中String类的方法在scala中都可以使用
     * 2、scala和java是互相兼容的
     * */

    //字符串切分:
    val c2: String = "wo,xiang,qu,kan,xu,song,de,yan,chang,hui"
    val strings: Array[String] = c2.split(",")
    println(strings(0)) //wo    注意scala中使用索引取值用(),java中使用的是[],但它们的索引都是从0开始
    println(strings(4), strings(5)) //(xu,song)

    //字符串拼接:
    //方式1:使用+拼接
    val c3: String = strings(0) + "*" + strings(1) + "*" + strings(2)
    println(c3)
    //方式2:使用StringBuffer或StringBuilder加append方法
    val c4: StringBuffer = new StringBuffer()
    c4.append(strings(0))
      .append("*")
      .append(strings(1))
      .append("*")
      .append(strings(2))
    println(c4)
    //方式3:利用scala中的mkString方法
    val c5: String = strings.mkString("*") //底层还是使用StringBuilder拼接字符串
    println(c5) //wo*xiang*qu*kan*xu*song*de*yan*chang*hui
    //方式4:插值表达式
    /**
     * scala中, 可以使用插值表达式来定义字符串, 有效避免大量字符串的拼接
     * 格式:val/var 变量名[:String] = s"${变量/表达式}字符串"(s可以换成f,效果相同)
     */
    val c6 = s"${strings(0)}*${strings(1)}*${strings(2)}"  //wo*xiang*qu   底层还是使用StringBuilder拼接字符串
    println(c6)


  }
}

四、if...else和for循环

import java.util.Scanner

/**
 * 流程控制:顺序结构 选择结构 循环结构
 */
object FlowControl {
  def main(args: Array[String]): Unit = {
    //选择结构之if...else
    val sc: Scanner = new Scanner(System.in)
    println("请输入你的考试成绩:")
    val score: Int = sc.nextInt()
    if (score < 60) { //引用变量、方法等不需要再后面加数据类型
      println("真遗憾你挂科了!哭")
    } else {
      println("恭喜你没有挂科!笑")
    }

    /**
     * 注意:
     * 1、scala语法中没有++或--
     * 2、scala中for循环的格式与java有很大的区别
     * 3、scala中泛型使用的是[],java中使用的是<>
     */


    //创建一个数组
    val arr1: Array[String] = Array("java", "scala", "spark", "flink")
    //使用for循环遍历数组
    for (e <- arr1) {
      println(e)
    }
    //使用while循环
    var i: Int = 0
    while (i < arr1.length) {
      println(arr1(i))
      i += 1
    }

    //scala的for循环中to与unitl的区别
    //to:[]左闭右闭
    for (e <- 1 to 10) {
      println("hello world")   //10个
    }
    println("*"*50)
    //until:[)左闭右开
    for (e <- 1 until 10) {
      println("hello world")   //9个
    }

  }
}

五、if与for

1、if

    /**
     * 在scala中,跟Java不同,条件表达式(if)是有返回值的,所以可以将它赋值给变量
     */
    val sc: Scanner = new Scanner(System.in)
    println("请输入你的考试成绩:")
    val score: Int = sc.nextInt()
    if (score < 60) {  //引用变量、方法等不需要在后面加数据类型
      println("真遗憾你挂科了!哭")
      score
    } else {
      println("恭喜你没有挂科!笑")
    }
    println("你的成绩是:"+score)

注意:在scala中,跟java不同,条件表达式(if)可以有返回值

2、for

/**
     * 注意:
     * 1、scala语法中没有++或--
     * 2、scala中for循环的格式与java有很大的区别
     * 3、scala中泛型使用的是[],java中使用的是<>
     */


    //创建一个数组
    val arr1: Array[String] = Array("java", "scala", "spark", "flink")
    //使用for循环遍历数组
    for (e <- arr1) {
//      println(e)
    }
    //使用while循环
    var i: Int = 0
    while (i < arr1.length) {
//      println(arr1(i))
      i += 1
    }

    //scala的for循环中to与unitl的区别
    //to:[]左闭右闭
    for (e <- 1 to 10) {
//      println("hello world") //10个
    }
    println("*" * 50)
    //until:[)左闭右开
    for (e <- 1 until 10) {
//      println("hello world") //9个
    }

六、IO

java读写文件和scala读文件的方式(scala没有写数据的方式)

import java.io.{BufferedReader, BufferedWriter, FileReader, FileWriter}
import scala.io.{BufferedSource, Source}

/**
 * 读取文件:
 * 1、java方式
 * 2、scala方式
 */
object IO {
  def main(args: Array[String]): Unit = {
    //1、java方式读取,写入数据
    //字符缓冲流读取文件
    val br = new BufferedReader(new FileReader("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi"))
    //字符缓冲流写入新文件(默认是覆盖)
    val bw = new BufferedWriter(new FileWriter("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi_new"))
    var line: String = br.readLine()
    while (line != null) {
      bw.write(line)
      bw.newLine() //写一个换行符
      line = br.readLine()
      bw.flush()
    }
    //释放资源
    bw.close()
    br.close()

    //2、scala方式读取数据,scala没有写数据的方式
    val reder: BufferedSource = Source.fromFile("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi_new")
    val lines: Iterator[String] = reder.getLines()     //获取该文件的所有数据
    for(e<-lines){
      println(e)
    }
  }
}