Scala学习
来源:互联网 发布:iphone手机倒计时软件 编辑:程序博客网 时间:2024/06/05 02:15
Scala是运行在JVM上的一门语言,一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。
scala安装目录下scala/api/scala-library/index.html 可查看scala的api文档
scala变量定义
var str : String = "zhangsan"
常量定义
val str2 : String = "zhangsan"
注:在scala中,对于变量必须要初始化,不允许只声明而不初始化。
scala的函数都有返回值,当函数定义有“=”时,返回值是最后一行语句执行的内容,如果最后一行语句没有返回内容
或函数定义时没有“=”,则该函数的返回值是Unit类型,即一个“()”.
def add(a:Int,b:Int) = { a + b } var c = add(1,2) print(c)返回值3
def add(a:Int,b:Int) = { println(a + b) } var c = add(1,2) print(c)
返回值是Unit类型 即()
def add(a:Int,b:Int){ a + b } var c = add(1,2) print(c)返回值是Unit类型 即()
判断结构
var a : Int = 1 if (a == 1) { println(1) }else if (a == 2) { println(2) }else { println(0) }while循环结构
while (true) { }for循环1到10 包含10
for(i <- 1 to 10){ println(i) }也可以使用方法调用形式1到10
for(i <- 1.to(10)){ println(i) }
for循环1到10 不包含10
for(i <- 1 until 10){ println(i) }
倒着遍历
for(i <- 1.to(10) reverse){ println(i) }
遍历1,3,5,7,9 即步长是2
for(i <- 1.to(10,2)){ println(i) }
循环中判断i等于3时输出,在scala中称为守卫
for(i <- 1.to(10,2); if i == 3){ println(i) }
双重for循环
for(i <- 1.to(10); j <- 1.to(5)){ println(i + " " + j) }
for的推导式,将循环结果保存为一个Vector
var a = for (i <- 1.to(10)) yield (i) println(a)
数组,可以指定统一类型,也可以省略。减一统一类型
//定长数组定义 长度为3的定长数组 var arr1 = new Array[Int](3) arr1(0) = 1<pre name="code" class="html"> arr1(1) = 2<pre name="code" class="html"> arr1(2) = 3//直接给数组赋值var arr = Array[Int](1,2,3,4) for(i <- arr) println(i) println(arr(2))//获取第三个元素<pre name="code" class="html"> println(arr.length)//数组长度
for(i <- 0 until arr.length)//遍历整个数组
println(i)
println(arr.mkString(","))//数组元素以逗号连接返回字符串
println(arr.sum)//数组中元素总和
println(arr.max)//数组中最大值
变长数组ArrayBuffer
var arr = ArrayBuffer[Int]() arr += 1 arr += 1 println(arr.mkString(","))
Array如果想添加元素的话需要先转成ArrayBuffer,调用Array的toBuffer
将一个数组添加到另一个数组中
arr ++= arr1
Map
//mutable包中的map可以修改,immutable中的map不可以修改,默认会使用不可修改的 var map1 = scala.collection.mutable.Map[String,Int]("zhangsan"->32,"lisi"->34) map1 += ("wangwu"->35) map1("lisi") = 20 println(map1("zhangsan")) println(map1) if(map1.contains("zhaoliu")) println(map1("zhaoliu")); println(map1.getOrElse("zhaoliu", "默认值"))//如果不存在key,返回指定的默认值 for((k,v) <- map1) println(k + ":" + v) for(item <- map1) println(item)
元祖
//元祖,用于函数的返回值不止一个的情况下 var t1 = (1,2,3,"aa") println(t1) //元祖的下标从1开始 println(t1._1) println(t1 _3)//空格也可以。。。 var (first,second,third,forth) = t1 println(second) //将Hello World进行分区返回一个元祖,分区的条件是是否是大写的 println("Hello World".partition { _.isUpper }) var arr1 = Array("a","b","c") var arr2 = Array(1,2,3) var arr3 = arr1.zip(arr2) println(arr3.mkString(","))//(a,1),(b,2),(c,3) println(arr3.toMap)//Map(a -> 1, b -> 2, c -> 3)
类中定义属性
object Demo3 extends App{ var a = new Acount() println(a.value) a.value = 10 println(a.value) //添加@BeanProperty(不能和private同时使用) 可以使用get set方法 a.setValue(40) println(a.getValue()) }class Acount{ @BeanProperty var value = 0}
类构造器
object Demo4 extends App{ var a = new Acount2(20)//调用主构造器 var a2 = new Acount2("a",20)//调用辅助构造器 println(a.value) a value = 10//可以用空格代替(.) println(a.value) //添加@BeanProperty(不能和private同时使用) 可以使用get set方法 a.setValue(40) println(a.getValue()) }//类构造器class Acount2(@BeanProperty var value : Int){ //辅助构造器,第一行必须调用主构造器 def this(a:String,b:Int){ this(0) println("辅助构造器" + a + b); }}
伴生对象
//scala类中不能提供静态字段和静态方法,需要借助伴生对象,即与类同名的对象/** * @author Administrator */object Demo5 extends App{ }object Acount3{ private var id:Int = 10}//类可以调用伴生对象中私有属性class Acount3{ private var value:Int = 0 def toStr { println(Acount3.id) }}
函数
//将函数赋值给变量 def f(a:Int) = { a + 1 } var fun = f _ println(fun(1))
//直接定义匿名函数赋值给变量,指定形参和函数体 var fun2 = (a:Int,b:Int)=>{a+b} println(fun2(1,2))
//将函数作为形参,定义新函数fun3.形参函数的形参是两个Int类型变量,返回值是一个Int类型变量,然后在函数体内调用形参函数 def fun1(a:Int,b:Int) = {a + b + 1} def fun3(fun:(Int,Int)=>Int)={fun(3,3)} println(fun3(fun1 _)) println(fun3(fun2))//fun2为上面定义的匿名函数
//1.匿名函数作为形参 //2.该匿名函数只有一个形参 //3.函数体只有一行 //可简写为下面的形式 def fun4(a:Int,fun:(Int)=>Int) = {fun(a)} println(fun4(3,(a:Int)=>{a + 3}))//该匿名函数形参满足条件要求 println(fun4(3,_+3))//简写形式 该匿名函数形参部分可省略,函数体中将形参替换为_
@BeanProperty
<span style="font-size:18px;">object Demo3 extends App{ var a = new Acount() println(a.value) a.value = 10 println(a.value) //添加@BeanProperty(不能和private同时使用) 可以使用get set方法 a.setValue(40) println(a.getValue()) }class Acount{ @BeanProperty var value = 0}</span>
高阶函数
<span style="font-size:18px;"> //将函数赋值给变量 def f(a:Int) = { a + 1 } //fun拥有了f函数的功能 var fun = f _ println(fun(1)) //直接定义匿名函数赋值给变量 var fun2 = (a:Int,b:Int)=>{a+b} println(fun2(1,2)) //将函数作为形参,定义新函数fun3.形参函数的形参是两个Int类型变量,返回值是一个Int类型变量,然后在函数体内调用形参函数 def fun1(a:Int,b:Int) = {a + b + 1} def fun3(fun:(Int,Int)=>Int)={fun(3,3)}//fun:(Int,Int)=>Int意思是传入函数fun,fun的参数类型是(Int,Int),返回值类型是Int println(fun3(fun1)) println(fun3(fun2)) //1.匿名函数作为形参 //2.该匿名函数只有一个形参 //3.函数体只有一行 //可简写为下面的形式 def fun4(a:Int,fun:(Int)=>Int) = {fun(a)} println(fun4(3,(a:Int)=>{a + 3}))//该匿名函数形参满足条件要求 println(fun4(3,_+3))//简写形式 该匿名函数形参部分可省略,函数体中将形参替换为_</span>
sacla中下划线(_)代表的意义
1.获取元祖的值 (t1._1 获取元祖t1的第一个元素)
2.将函数赋给变量 ( var fun = f _)
3.数组中的每个元素
0 0
- scala学习
- Scala 学习
- scala 学习
- Scala学习
- Scala学习
- scala学习
- Scala 学习
- scala学习
- SCALA学习
- scala学习
- scala学习
- 学习SCALA
- scala学习
- scala学习
- Scala学习
- 学习scala
- Scala 学习
- scala学习
- 黑马程序员——Java基础之函数与数组
- JS显示动态显示当前时间代码
- 【Scala】高阶函数和柯里化
- 新手学习编程的最佳方式是什么?
- Platform设备驱动
- Scala学习
- Adaboost
- 【Scala】Scala的类层级
- proftpd的mod_copy模块未授权调用利用记录
- 关于ffmpeg的avpacket里的pts问题
- Javascript 类的实现
- Flatten Binary Tree to Linked List - LeetCode 114
- ado.net连接oracle
- 【Scala】特质与特质的线性化