从零学scala(六)操作符、高级函数
一:操作符
这一章几乎是Java操作符的简单介绍,大佬们可以直接跳过,看第二章。
1.标识符
val ** = "as" //**也可以是变量名称
println(**)
val `【】四川省` = "abcd" //``内可以写任意的字符串
println(`【】四川省`)
2.中置操作符
for(i <- 1 to 10){ println(i)} //其实就是调用的1.to(10)方法
3.一元操作符
//只有一个参数的操作符称为一元操作符
//1.toString()
4.赋值操作符
val data = "abcd" //赋值操作符,很常见的
5.优先级
//这一章节建议大家多使用()来确定优先级,只需要记住*/高于+-,<> 高于&^|。这两种就可以了
6.结合性
//这一章的意思是,操作符相关是按照从左到右的顺序的。例子:1+2+3计算方法是第一个加号操作的是1和2,第二个加号操作的是2和3。
//基本上和数学是一样的
7.apply和update方法
val data = scala.collection.mutable.Map("a"->1,"b"->2,"c"->3,"d"->4)
data("a") = 11 //其实调用的是data.update("a",11)
val a = data("a") //其实调用的是 data.apply("a")
//apply方法常用到new对象中
val data = Array.apply("abcd") //其实调用的是方法new Array
println(data.mkString("|"))
8.提取器
//提取器是apply的反向操作名称为unapply,参数为一个对象,将构造对象的参数提取出来
//例子:上一节中通过abcd构造了一个Array对象,而unapply方法就是传递进去data,返回abcd字符串。其实Array是没有这个方法的
单个参数或无参数的提取器
//该提取器的方法是将字符串提取成数字
object Number {
def unapply(inputString:String):Option[Int]={
try{
Some(Integer.parseInt(inputString.trim()))
}catch{
case ex:NumberFormatException => None
}
}
}
9.unapplySeq方法
//上述的方法只能提取一个数字,但是真正在提取过程中提取一般是提取一个Seq
object Number {
def unapply(inputString:String):Option[Array[String]]={
try{
Some(inputString.trim().split("\\|").toArray)
}catch{
case ex:NumberFormatException => None
}
}
}
object FastLearnScala{
def main(args: Array[String]): Unit = {
println(Number.unapply("1 9 7 8"))
}
}
二:高阶函数
1.作为值的函数
val num = 3.1415926
val fun = scala.math.max _ //_说明的是用fun指向这个函数
println(fun(1,3))
2.匿名函数
val num = (num:String)=>{num + "abcd"} //这种方法就是一个匿名函数
println(num("1234"))
val array = num("1234|").split("\\|") //其实使用最多的还是map方法,如下也是一个匿名函数
array.map { x => println(x) }
3.带函数参数的函数
object FastLearnScala{
//传递的是一个函数,输入是Double,输出也是Double。最终调用的是函数,传递的参数是0.25
def valueAtOneQuatter(f:(Double)=>Double) = { f(0.25) }
def main(args: Array[String]): Unit = {
println(valueAtOneQuatter(scala.math.ceil _))
}
}
//一般情况下不这样使用。直接调用函数就行了
4.参数类型推断
//scala会将一些自动推断出来,你需要的类型
val data = 3 * 1//scala会自动推断出来data是Int类型的,在函数中也是一样的
5.一些有用的高阶函数
val data = Array(1,2,3,4,5)
//map函数 针对数组每一个元素都进行+10的操作
data.map { x => x+10 }
//过滤出来>5的元素
data.filter(_ > 5)
//reduceLeft接受一个二元函数,并将它应用到所有元素
data.reduceLeft(_*_) //其实是(((1*2)*3)*4)*5
//sortWith排序函数
data.sortWith((x,y)=>x>y).mkString("|")
6.闭包
//函数可以在变量不在处于作用域时被调用,简单说就是函数可以帮你暂存你的数据,因为你的数据指向函数导致了函数不会被回收
object FastLearnScala{
def mulby(x:Int) = (y:Int) => x*y //该函数将x作为一个参数,x作为第二个参数,计算x*y的值
def main(args: Array[String]): Unit = {
val a = mulby(10)
val b = a(3)
println(b)
}
}
7.SAM转换
//其实是单个抽象方法,就是只有一个抽象方法。
//如下是一个计数的方法
import javax.swing.JButton
import java.awt.event.{ActionListener,ActionEvent}
object FastLearnScala{
def main(args: Array[String]): Unit = {
var counter = 0
val button = new JButton("increate")
button.addActionListener(new ActionListener{
override def actionPerformed(event:ActionEvent){
counter += 1
}
})
}
}
//其实在真正的使用过程中,更多的是需要一个new ActionListener的封装,只需要调用即可,那我们可以进行改造
var counter = 0
implicit def makeAction():ActionListener = {
new ActionListener{
override def actionPerformed(event:ActionEvent){
counter += 1
}
}
}
val button = new JButton("increate")//调用使用
button.addActionListener(makeAction)
8.柯里化
//上一个章节的闭包就是柯里化
object FastLearnScala{
def mulby(x:Int) = (y:Int) => x*y //该函数将x作为一个参数,x作为第二个参数,计算x*y的值
def main(args: Array[String]): Unit = {
val a = mulby(10)
val b = a(3)
println(b)
}
}
//上面的过程可以分解为:传入x的时候返回一个函数(y:Int)=>x*y
9.控制抽象
//没有看懂,后面再补充吧
return表达式
//scala写法支持return,但是不建议使用。默认是将最后一个变量返回
def mm():Int = {
var data = 0
if(1 > 3) data = 0 else data = 0
data
}
搬砖多年终不得要领,遂载源码看之望得真经。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?