1、 Scala 学习
在bg中创建Scala模块,导入3个org.scala-lang依赖 和 1个Java Compiler(Java 编译的插件) 、1个Scala Compiler(Scala 编译的插件)
(1) java类是class定义的,scala是object定义的
def : 定义方法的关键字
Unit : 无返回值,相当于java中的void
main方法需要放在object中才能运行 -- main名字不可以改,scala是根据名字识别main的
Array[String] : 参数类型(String类型的数组)
[] : 在scala代表泛型
{} 中是代码体
object Demo01HelloWorld {
def main(args: Array[String]): Unit = {
//java的方式
System.out.println("java")
//scala的方式
// scala中很多代码都可以简写,底层和java是完全一样的
println("HelloWorld")
}
}
(2) 一个scala文件经过编译后会出现两个class文件 : xx$.class 、 xx.class
xx.class代码会调用xx$.class代码,其实scala代码本质上还是java代码,只是在java代码上做了一个封装。
两者底层是一模一样的,只是代码语法不一样。
java代码的.class文件可以反编译回.java代码, 而scala代码的.class文件只能反编译回.java代码。
2、变量
val : 常量 -- 不能再指向其它的对象
var : 变量
如果后面不会对变量进行修改则使用val
在java中使用final实现常量val
(1) scala 变量的类型可以自动推断,根据 "=" 右边的值,自动推断变量的类型
val str = "scala" // 可以自动推断出str是String类型 -- 可读性差
//也可以手动加上类型
val str: String = "scala"
(2) 类型转换 :
想转什么类型直接 .toxx 即可 (toInt、toDouble、toString ...)
注意转换的类型是否正确
3、方法(函数):
java 中只能在类中定义方法
scala 可以在任何位置定义方法
方法 : 需要通过类的对象来调用的
函数 : 在任何地方都能定义,且直接调用的
(1) 函数简写 :
1、方法无参数 -- 可以省略括号 ()
2、返回值类型可以自动推断, 根据返回值自动推断返回值类型
3、方法体中只有一行代码时 -- 可以省略大括号 {}
4、最后一行可以省略 return , 默认最后一行作为返回值
(2) 可变参数 : i: Int*
4、数组 -- 快速创建
val arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)
5、遍历
(1)增强for
for (a <- array) {
println(a)
}
(2)通过下标索引
var i = 0
while (i < arr.length) {
// scala通过 () 取下标获取元素
val value: Int = arr(i)
println(value)
i += 1
// i++ // scala没有i++
}
(3) foreach --- scala 特有的方法
arr.foreach(println)
6、 IO流
// 底层还是java的io流
val bs: BufferedSource = Source.fromFile("data/students.txt")
// 读取所有行,得到一个迭代器
val lines: Iterator[String] = bs.getLines()
// 增强for 遍历
for (line <- lines) {
println(line)
}
// scala特有的遍历方法
lines.foreach(println)
7、异常 -- scala语言默认将异常已经抛出去了,不需要管
try {
异常代码
} catch {
// 匹配异常
case e : 异常类 => 异常处理
} finally {
println("都会执行")
}
8、 JDBC
(1) 需要导入依赖 :
<!-- 连接数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
def main(args: Array[String]): Unit = {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver")
//2、建立链接
val con: Connection = DriverManager.getConnection("jdbc:mysql://192.168.129.201:3306/bigdata", "root", "123456")
//3、写sql查数据
val stat: PreparedStatement = con.prepareStatement("select * from students")
//4、执行查询
val resultSet: ResultSet = stat.executeQuery()
//5、解析数据
while (resultSet.next()) {
//通过列名取数据
val id: Long = resultSet.getLong("id")
val name: String = resultSet.getString("name")
val age: Long = resultSet.getLong("age")
val gender: String = resultSet.getString("gender")
val clazz: String = resultSet.getString("clazz")
println(id + "\t" + name + "\t" + age + "\t" + gender + "\t" + clazz)
}
//关闭链接
stat.close()
con.close()
9、 class -- 类
(1) scala中也是通过class定义类
(2) 在scala的类中有一个默认的构造函数 , {}包裹的就是默认构造函数
(3) scala 类中不需要写 get、set方法
(4) 重载构造函数 关键字 : this 。 在重载构造函数的第一行需要先调用默认的构造函数 : this调用
(5) 重写 toString 方法 关键字 : override
class Student(id: String, name: String) {
// 定义属性 ,为了区分,一般命名: _属性名 定义时就赋值
var _id: String = id
var _name: String = name
var _age: Int = _ // 给重载构造函数的参数age定义的,下划线的作用是占位符
// 重载
def this(id: String, name: String, age: Int) {
// 先调用默认构造函数
this(id, name)
// 通过 this 给成员变量 age 赋值
this._age = age
}
// 重写 toString
override def toString: String = {
// scala 中的字符串拼接 s""
s"Student(" + _id + "\t" + _name + "\t" + _age + ")"}
}
10、 样例类 -- 直接一行代码就写完
case class User(id:String, var name:String, age:Int = 20)
// 在object中创建样例类对象 ,new 可以省略不写 (普通类不能省略)
// 之所以可以不用new, 是因为底层其实就是apply原理
val user = new User("001", "张三")
样例类 : 帮助我们简化写代码的类
scala在编译的过程中会自动的给样例类增加额外的属性、方法和构造函数
样例类属性默认不支持修改,需要增加var才能修改
当添加新的属性,只需要在样例类参数后面加上即可
可以给参数设置默认值
11、 Apply
是一个特殊的类(类和对象绑定了,只有一个对象)
object中的方法可以直接调用,不需要创建对象 , 相当于在方法上加了 static
object Test {
def apply(): Unit = {
println("apply")
}
}
// 1、 可以通过Test. 的方法调用 apply方法
Test.apply()
// 2、 直接通过Test() 调用 apply方法
Test()