Scala HelloWorld、Scala和java的关系、Scala是什么、Scala的特点、Scala和java的兼容(Scala的基础语法简介)

Scala HelloWorld

在 Scala 模块的 src.main.java 目录下创建一个包用来管理我们的 Scala 代码

然后 在包中新建一个 Scala 的类,右击包 --> New --> Scala Class

并 指定 Scala 类的类型为 Object(对象)

注意 :

在 Scala 中一行命令不需要以分号结尾,但是如果一行里面写了多条命令,多条命令之间以分号分隔

Scala 的 main 方法 需要放在 object 里面 才能运行

package com.shujia.scala

/**
  *
  * class 是一个类
  * object: 是一个对象,object中定义的所有的方法可以直接调用 所以 object 可以理解为 static
  *
  */
object Demo1Helloworld {

  /**
    * main 需要放在object才能运行
    *
    * def  : 定义方法的关键字
    * main : 方法名
    * (args: Array[String]) 方法的参数
    * args : 参数名,Array[String] ;参数类型(字符串数组)
    * Unit : 返回值,相当于void 可以省略不写
    *
    *  []  : scala中的泛型
    *
    */
  def main(args: Array[String]): Unit = {
    println("scala")
    //println 底层和java是一样的
    System.out.println("java")
  }
}

scala 与 java 的关系

Scala 是什么?

Scala 是 Scalable Language 的简写,是一门多范式的编程语言

联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel的工作开始设计Scala。

Scala是把函数式编程思想和面向对象编程思想结合的一种编程语言。

大数据计算引擎Spark由Scala编写

Scala 很多地方就是对 java 的延续,一种更高层的封装和简化

Scala 和 java 是语法不兼容,但是类兼容的

所以说 Scala 的底层还是 java

Scala 特点

Scala 与 java 的兼容(Scala的基础语法简介)

变量、常量的定义

字符串

在 Scala 中使用 java 的集合与IO流

package com.shujia.scala

import java.io.{BufferedReader, FileReader}
import java.util

object Demo2SscalaOnJava {
  def main(args: Array[String]): Unit = {

    /**
      * 变量和常量
      *
      * var : 变量
      * val : 常量
      *
      * 尽量使用val 因为性能更好一点
      *
      * scala中变量的类型可以自动推断
      * 通过等号右边的对象推断类型
      * 当然也可以手动添加类型
      * 
      */

    // scala中变量的类型可以自动推断
    // var str = "scala"
    
    // 也可以手动添加类型
    var str: String = "scala"

    str = "java"

    /**
      * scala中的字符串和java中的字符串是一样的
      *
      * 之前java中学过的所有的方法在scala中同样适用
      */

    // val split: Array[String] = str.split("")

    /**
      * scala对java中的类做了很多的扩展,增加了很多好用的方法(隐式转换)
      */
      
    // 获取头
    val head: Char = str.head

    println(head)

    // 获取不包含头的所有元素
    println(str.tail)

    // 获取最后一个元素
    println(str.last)

    // 这里的 * 是一个方法,表示将等号重复100次,完整形式如下
    // println("=".*(100))
    // 简化版
    println("=" * 100)
    
    /**
      * java中集合在scala中的使用
      */

    val list = new util.ArrayList[Int]()

    list.add(1)
    list.add(2)
    list.add(3)

    println(list.get(1))
    println(list)

    // scala中遍历java的集合
    var i = 0

    while (i < list.size()) {
      println(list.get(i))
      i += 1
    }

    /**
      * 在scala中使用java的io流
      */

    val fileReader = new FileReader("data/students.txt")

    val bufferedReader = new BufferedReader(fileReader)

    // 读取第一行
    var line: String = bufferedReader.readLine()
    // 在Scala中赋值和判断不能写在一起
    while (line != null) {
      println(line)

      // 读取下一行
      line = bufferedReader.readLine()
    }
  }
}

在 java 类中 new Scala 类的对象

package com.shujia.scala

/**
  * scala中类
  */
class Demo3ScalaClass {

  /**
    * 类中定义的方法
    */
  def print(s: String): Unit = {
    println(s)
  }
}

/**
  * java中类
  */
package com.shujia.scala;

public class Demo4JavaCode {
    public static void main(String[] args) {

        /*
         * java 和 scala 类可以相互兼容,
         * 语法(关键字)不兼容
         */
        Demo3ScalaClass demo3ScalaClass = new Demo3ScalaClass();

        demo3ScalaClass.print("java");
    }
}

变量和常量

增强for循环

while 循环

foreach

scala可以使用java中的io流

Scala 中读文件的方式 -- Source

scala 字符串拼接

scala mysql jdbc

package com.shujia.scala

import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}

import scala.io.{BufferedSource, Source}

object Demo5Base {
  def main(args: Array[String]): Unit = {
  
    /**
      * 变量和常量
      * val : 常量
      * var : 变量
      *
      * 尽量使用val 因为性能更好一点
      *
      * scala中变量的类型可以自动推断
      * 通过等号右边的对象推断类型
      * 当然也可以手动添加类型(推荐)
      */

    val a: Int = 1
    
    // scala中变量的类型可以自动推断
    // var str = "java"
    
    // 也可以手动添加类型
    var str: String = "java"


    /**
      * 循环
      */
    
    // Array(1, 2, 3, 4, 5, 6, 7, 8, 9) Scala 中 定义数组

    val array: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

    // 增强for循环
    for (i <- array) {
      println(i)
    }

    println("=" * 100)

    // while 循环

    var i = 0

    while (i < array.length) {

      // 通过下标获取元素
      println(array(i))

      i += 1
    }

    println("=" * 100)

    /**
      * foreach
      *
      * (i => println(i))  匿名函数
      */

    array.foreach(i => println(i))


    /**
      * io流: scala可以使用java中的io流
      */

    println("=" * 100)

    // Scala 中读文件的方式 -- Source
    // 链式调用
    val lines: Iterator[String] = Source.fromFile("data/students.txt").getLines()

    for (line <- lines) {
      println(line)
    }

    println("=" * 100)
    
    /**
      * scala 字符串拼接
      */

    // java的方式
    val s: String = "java" + "scala" + "hadoop"

    val stringBuffer = new StringBuffer()

    stringBuffer
      .append("java")
      .append("scala")
      .append("hadoop")

    println(stringBuffer.toString)
    

    /**
      * scala 字符串拼接
      */


    val s2 = "java"
    val s3 = "scala"
    val s4 = "hadaoop"

    /**
      * s"$s2$s3${s4}shujia"
      * ${} : 表示引用变量、{} 可以省略
      * s : 是一个函数,底层调用还是 append
      * ${s4}shujia : s4 后面有字符串 shujia 会产生冲突,因为并没有s4shujia这个变量,所以需要用 {} 将他俩分开
      */
      
    val s5 = s"$s2$s3${s4}shujia"

    println(s5)


    /**
      * scala mysql jdbc
      */
      
    /*
    
    在Scala模块的pom.xml文件中添加依赖
    
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>
        
     */

    // 1、加载驱动  Scala 默认会抛出异常
    Class.forName("com.mysql.jdbc.Driver")

    // 2、创建链接
    val con: Connection = DriverManager.getConnection("jdbc:mysql://rm-bp1h7v927zia3t8iwho.mysql.rds.aliyuncs.com:3306/students", "shujia012", "123456")

    // 3、查询数据
    val stat: PreparedStatement = con.prepareStatement("select * from students")

    // 4、执行查询
    val resultSet: ResultSet = stat.executeQuery()

    while (resultSet.next()) {
      val id: Long = resultSet.getLong("id")
      val age: Long = resultSet.getLong("age")
      val name: String = resultSet.getString("name")
      val clazz: String = resultSet.getString("clazz")
      val gender: String = resultSet.getString("gender")

      println(s"$id\t$name\t$age\t$gender\t$clazz")
    }

    //关闭链接
    con.close()
  }
}

Scala中的类的用法

package com.shujia.scala

object Demo6Class {
  def main(args: Array[String]): Unit = {

    //创建对象
    val student = new Student("001", "张三", 23)

    println(student)

    student.setId("002")

    println(student)

  }
}

/**
  * 类中可以定义属性,方法,构造函数,还可以继承父类,实现接口
  */
  
// scala 中类的默认无参构造函数就是 类名后面的 {……} 
// class Student {
//
//   println("默认构造函数")
//  
//   }

// 给默认的构造函数加上参数
// class Student(变量名:变量类型,……) {
//
//   println("默认构造函数")
//  
//   }

// 默认构造函数的重载
 class Student(id: String, name: String) {

   println("默认构造函数")
  
  /**
    * 定义类的属性
    *
    * private: 私有化
    *
    * _ 占位符,这里相当于区分了一下名字 _id和id
    *
    */
  private var _id: String = id

  val _name: String = name
  
  /**
    * _ 占位符,相当于给变量一个默认值
    */
    
  var _age: Int = _

  /**
    * 重载构造函数
    */
    
  def this(id: String, name: String, age: Int) {
    //在重载构造函数的第一行需要先调用默认构造函数
    this(id, name)

    println("重载构造函数")

    this._age = age
  }


  /*  override def toString(): String = {
      return s"Student($_id, $_name, $_age)"
    }*/

  /**
    * scala中函数的省略
    * 1、如果函数没有参数,()  可以省略
    * 2、返回值类型可以不写,会自动推断
    * 2、如果函数最后一行作为返回值,return可以省略
    * 4、如果函数中代码只有一行 {} 可以省略
    */

  //重写父类的方法
  // _ 在Scala中有特殊意义,$ 引用 以_开头的变量 的时候需要加上{},例如:${_id}
  override def toString = s"Student(${_id}, ${_name}, ${_age})"

  /**
    * get set 方法
    * IDEA不能自动生成
    */

  def getId: String = this._id

  def setId(id: String): Unit = {
    this._id = id
  }
}

样例类

package com.shujia.scala

object Demo7CasrClass {
  def main(args: Array[String]): Unit = {

    //使用样例类
    val user = new User("001", "李四")

    println(user)

    //获取属性的值
    println(user.name)

    //修改属性的值
    user.name = "张三"

    println(user)

    /**
      * 样例类创建对象的另一种方法,不用 new
      */

    val user2 = User("002", "王五")
    println(user2)

  }
}

/**
  * 样例类
  *
  * scala 在编译的过程中会动态的给样例类增加方法(toString,hashCode,equals,……)
  * 并将参数变成类的属性,默认是常量
  * 若想将属性设置为变量,则需要在变量名(属性名)之前加上 var
  */

case class User(id: String, var name: String)

Scala 类的继承

package com.shujia.scala

object Demo8Extends {
  def main(args: Array[String]): Unit = {

    val a = new B("001", "张三", 23)
    // 调用方法 就近原则
    println(a)
  }
}

// B 继承 A 

/*

class A() {

}

/**
  * 类的继承
  * 会继承父类的属性,方法
  */
class B() extends A() {

}

*/

// B 继承 A 时,父类 A 的构造方法需要传参

// 父类 A 的默认有参构造方法 需要传入 id name
class A(id: String, name: String) {

  val _id: String = id
  val _name: String = name

  override def toString = s"A(${_id}, ${_name})"
}

// B 需要将 参数传过去
// 要想初始化子类 必须先初始化父类 ,所以子类 B 的默认有参构造方法 会先调用父类 A 的默认有参构造方法
// B 的默认有参构造方法需要将 id name 传给父类 A 的默认有参构造方法
class B(id: String, name: String, age: Int) extends A(id, name) {

  val _age: Int = age

  // 重写父类Object的方法
  // 调用方法 就近原则
  override def toString = s"B(${_id}, ${_name},${_age})"
}

Scala 特征(接口)

抽象类

package com.shujia.scala

object Demo9Trait {
  def main(args: Array[String]): Unit = {

    val dog = new Dog

    dog.print()

    dog.cry()


    /**
      * 父类的引用指向子类的对象
      *
      */

    val cat: Cry = new Cat

    cat.cry()
    cat.print()

  }
}

/**
  * scala中的特征,trait可以写抽象方法也可以写普通方法
  *
  */

trait Cry {
  /**
    * 抽象方法
    *
    */
  def print()

  /**
    * 普通方法
    *
    */
  def cry(): Unit = {
    println("动物叫")
  }
}

// 在 Scala 中只有继承 extends 的关键字,所以 trait 特征也是用继承 extends 关键字来实现特
// 征

class Dog() extends Cry {
  /**
    * 实现特征中的抽象方法
    *
    */

  override def print(): Unit = {
    println("狗叫")
  }
}

class Cat() extends Cry {
  /**
    * 实现特征中的抽象方法
    *
    */
  override def print(): Unit = {
    println("猫叫")
  }
}

// scala 中也有抽象类,例如

// abstract class Dog(){

// }

Scala 对象 Object

apply 方法

package com.shujia.scala

object Demo10Object {
  def main(args: Array[String]): Unit = {
    
    Test.print()

    //调用apply 方法
    Test()

    //调用有参的apply方法
    Test("scala")
  }
}


/**
  * object: 是scala的对象,是这个类的一个单例对象
  *
  * 对象中的方法可以直接调用
  *
  * object : 相当于java中static
  */
object Test {
  def print(): Unit = {
    println("test")
  }

  /**
    * apply : 可以直接通过对象加上括号调用
    * 这是对象里面一个很特殊的方法,只要方法名称叫 apply 即可
    */
  def apply(): Unit = {
    println("apply")
  }

  def apply(s: String): Unit = {
    println(s)
  }
}

样例类与apply

package com.shujia.scala

object Demo11Apply {
  def main(args: Array[String]): Unit = {

    val s1: Score = new Score("001", 100)
    // 通过伴生对象来 new Score 的对象,可以达到类似样例类的效果
    val s2: Score = Score("002", 80)

  }
}


class Score(id: String, sco: Int) {
  val _id: String = id
  val _sco: Int = sco

  override def toString = s"Score(${_id}, ${_sco})"
}

/**
  * 伴生对象
  * 伴生对象并不是上面Score类的对象,上面Score类的对象是需要new出来的
  */
object Score {
  //创建上面 Score 类的对象,并返回
  def apply(id: String, sco: Int) = new Score(id, sco)
}

Scala 类型转换

package com.shujia.scala

object Demo12CastType {
  def main(args: Array[String]): Unit = {


    /**
      * scala中类型转换
      *
      */

    val s: String = "1000"


    // java的方式
    val i: Int = Integer.parseInt(s)
    println(i)


    // scala的方式
    // 只要在 Scala 中涉及到类型转换的问题 to 就完事了
    val i2: Int = s.toInt
    println(i2)

    //如果类型不匹配会出现类型转换异常
    //val i3: Int = "asdsa".toInt


    val j = 1000

    println(j.toDouble)
    
  }
}

Scala 异常处理

package com.shujia.scala

object Demo13Exception {
  def main(args: Array[String]): Unit = {

    /**
      * scala中的异常会自动抛出,可以不处理
      *
      */
      
    //1、抛出异常对象
    
    //throw new RuntimeException

    // try …… catch …… finally …… 处理异常
    
    try {
      val i: Int = "asdasd".toInt
      // try 中出现异常,报错代码下面的代码就不会执行了
      println(i)
    } catch {
      //case 是匹配的意思,如果出现的异常是后面的异常类型,就走大括号中的代码
      case e: NumberFormatException => {
        println(e)
      }
      case e: RuntimeException => {
        println(e)
      }
    } finally {
      println("finally")
    }
    // 因为异常被处理,所以println照常输出
    println("main函数接收")
  }
}
posted @ 2022-03-03 21:39  赤兔胭脂小吕布  阅读(101)  评论(0编辑  收藏  举报