Scala
Scala
1.初识scala
scala:面向对象,面向函数,静态类型语言
可在scala中直接调用java的Api和方法,与java互通
代码优雅,开发速度快,能融合到生态圈
java:
public class HelloWord{
public static void main(String[] args){
System.out.println("Hello Word");
}
}
scala:
object HelloWord{
def main(args:Array[String]){
println("Hello Word")
}
}
2.scala入门
2-1 val 和 var
val 最常用,值不能变,
var 值可变
定义格式:val 值名称:类型=xxx
val a:int =2 或者 val a =2 scala可自动识别2为int,则此处可省略:int
2-2 基本数据类型
Byte/Char
Short/Int/String/Long/Float/Double
Boolean
val a=10.asInstanceOf[Double] 类型转换
isInstanceOf:判断值是否某种数据类型
2-3 Lazy在scala中的使用
lazy val a=1
结果: a:Int=<lazy> 主要用作延时加载功能,,但不常用
2-4 scala常用开发工具:IDEA
3.scala函数
3-1 方法的定义和使用
def add(a:Int,b:Int):Int={
x+y
}
def 方法名(参数名:参数类型,参数名:参数类型):函数返回值类型={
//括号内的叫做方法体
...
//方法体的最后一行为返回值,不需要使用return
}
如果没有入参的函数,调用时括号可以省略
3-2 默认参数的使用
默认参数:在函数定义时,允许指定参数的默认值
def sayName(name:String="chen"){}
调用时:sayName()
结果: 若不穿参数,则为默认值,传了参数,就为传的参数
3-3 命名参数的使用
在函数调用时可以不按照函数定义的顺序来传递,但需要带上参数名称。 一般不推荐使用
3-4 可变参数的使用 参数的个数可以变化
def sum(numbers:Int*){
val result=0
for(number<-numbers){
result+=number
}
result
}
3-5 条件表达式
if(){
}else{
}
3-6 循环表达式
to,Range,Until
1 to 10 类似于 1.to(10) ---->(1,2...10)
Range(1,10) ----->(1,2...9)
1 until 10 类似于 1.until(10) ----->(1,2...9)
for(i <- 1.to(10)){}
for(course <- courses){}
courses.foreach(course => println(course))
4.scala面向对象
4-1 面向对象的概述
封装:把属性,方法封装到类里面
继承:父类和子类之间的关系
多态:父类的引用指向子类的对象
Person person=new User();
4-2 类的定义和使用
class People{
//定义属性
//定义方法
}
使用时: val person=new People()
person.xxx
4-3 构造器
class People(val name:String,val age:Int){}
即:跟在类名后的叫做主构造器
def this(name:String,age:Int,gender:String){
//附属构造器的第一行代码必须要调用主构造器或者其他附属构造器
this(name,age)
this.gender=gender
}
即:调用this主构造器的叫做附属构造器
4-4 继承和重写
class Student(name:String,age:Int,var major:String) extends PerSon(name,age){}
当父类中有该参数时,不需要加val ,若没有,则必须使用var,否则访问不到
重写
override val school="xxx"
对父类的属性和方法进行重写,一定要使用override关键字
4-5 抽象类
类的一个或者多个方法没有完整的实现(只有定义,没有实现)
abstract class Person{}
若要 new Person(),则需要实现这个抽象类中的方法和属性,即重写方法和属性
4-6 伴生类和伴生对象
class ApplyTest{}
object ApplyTest{}
如果有一个class,还有一个和他同名的object,则class是object的伴生类,object是class的伴生对象,两者必须同时存在
4-7 Apply
val b=ApplyTest() //默认会调用Object.apply()方法
即:类名()默认调用Object中的apply()
对象()调用的是Class中的apply()
最佳实践:在object 的apply方法中去new class
使用时直接类名(),不需要New
4-8 case class
case class Dog(name:String)
//case class不需要new 一般用在模式匹配中
4-9 Trait
xxx extends ATrait with BTrait with CTriait{}
只有第一个用extends,其他的都用with
5 scala集合
5-1 定长数组
val a= new Array[String](5)
val a =new Array("hadoop","spark","storm")
//默认调用Array中的 apply方法
val c= new Array(2,3,4,5,6)
数组转换为字符串时用 c.mkString(",") ==>2,3,4,5,6
5-2 可变数组
val a=scala.collection.mutable.ArrayBuffer[Int]()
可变数组赋值:d+=1 d+=2 d+=(3,4,5) d++=Array(6,7,8)
d.insert(0,0) 在第一个位置加个0
d.remove(1) 把第二个位置的值删除
d.remove(0,3)从第一个开始删掉3个
d.toArray 由可变数组转换为定长数组
for( ele <- d){ println(ele)} 取出数组中的元素
5-3 List 有序可重复
Nil:不可变的List,是一个空集合
val l=List(1,2,3,4,5)
l.head=1 l.tail=(2,3,4,5)
head是第一个元素,tail是剩下的元素组成的新List
val l2=1 :: Nil ==> List(1)
val l3=2 :: l2 ==> List(2,1)
5-4 Set 无序不可重复
val set=Set(1,2,2,3,4) ==>Set(1,2,3,4)
6.模式匹配
基本语法:
变量 match {
case value1 => 代码1
case value2 => 代码2
...
case _ =>代码N
}
7.scala函数高级操作
7-1 字符串高级操作
插值:
val name="chen"
println(s"Hello: $name") ==> Hello chen
三次 shift + “” 即可输入多行字符串
7-2 匿名函数
函数是可以命名的,也可以不命名
(参数名:参数类型)=>函数体
map(x=>(x,1))
7-3 curry函数 颗粒化
将原来接收的两个参数的一个函数转换为两个
def sum(a:Int,b:Int)=a+b
def sum(a:Int)(b:Int)=a+b
7-4 高阶函数
val l=list(1,2,3,4,5,6,7)
7-4-1 map :逐个去操作集合中的所以元素
l.map((x:Int)=>x+1)
l.map((x)=>x+1)
l.map(x=>x+1)
l.map(_+1)
结果: l=list(2,3,4,5,6,7,8)
l.foreach(println)
7-4-2 filter 过滤器
l.map(_+1).filter(_<8)
l=list(2,3,4,5,6,7)
7-4-3 take 取前几个元素
l.take(2) ==>list(1,2)
7-4-4 reduce,reduceLeft,reduceRight
l.reduce(_+_)
l中的元素两两相加,即求和 两个进去,出来一个
7-4-5 max,min,sum,foreach
7-4-6 flatten 展开 铺平,压扁
flatMap flatten+map 先flatten ,再map
l.flatMap(_.map(_ * 2))
7-5 偏函数
被包在花括号内,没有match的一组case 语句。主要用在模式匹配
def say:PartialFuction[A:String,B:String]{}
A:输入参数类型, B:输出参数类型
8.scala 隐式转换
8-1 隐式转换概述
为一个与存在的类添加一个新的方法:(第三方,无法更改的类)
//定义一个隐式转换函数即可
进来一个普通的,出来一个牛逼的=new 牛逼的(传入普通的)
implicit def man2superman(man:Man):Superman = new Superman(man.name)
增强一个类中的方法,即可以调用另一个类中的方法
8-2 隐式参数,隐式类,,了解
9.scala操作外部数据
9-1 操作文件
val file=source.fromFile("文件路径") 其中source为io中的类
val lines=file.getLines() 一行行的读
lines.foreach(line => println(line))
val file=source.fromURL("网址")
9-2 操作Mysql
9-3 读取xml文件
XML.load(this.getClass.getClassLoader.getResource("test.xml"))
9-4 读取xml文件中的属性
10.项目实战
10.1 项目概述
Spring Boot + Spring Data JPA +Scala + Java 混编
10.2 项目需求
10.2.1 论统一元数据管理在大数据平台中的重要性(SparkSQL/Hive)
元数据管理MetaStore
采集
维护:******
稽查
分析
10.2.2 构建大数据统一的元数据管理
10.3 项目需求分析
1.数据库管理: db1,db2
id name location:数据库存放在HDFS等文件系统上的牡目录
2.表管理 table1,table2 表时要属于某一个数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)