scala是纯粹的面向对象语言,每个操作都是方法调用。
scala也是函数式编程语言,它有两种理念:1、函数式头等值,在函数式语言中,函数也是值,与整数或字符串处于同一个地位。函数可以被当作参数传递给其他函数。2、程序的操作应该把输入值映射为输出值而不是就地修改数据。
scala有不可变的列表、元组、映射表和集。
scala调用java中string对象中toInt方法是发现没有,它会将java的String对象隐式转换成Scala中的RichString对象,RichString有toInt方法。
一、变量定义
scala有两种变量:var和val,val类似于java里面的final变量。一但初始化了,val就不能再被赋值了。
*在java里,返回的值得类型称为返回类型,在scala里面称为结果类型。
*scala中的<-符号代表“其中”。如果要读for(arg<-args),就读做“对于args中的arg”。
*不写new List,因为“List.apply()”是定义在scala.List伴生对象中的工厂方法。
Nil是空列表的简写同List()
二、列表List的常用方法
val t = "Will" :: "fill" :: "until" :: "Util" :: Nil
println(t(2)) //返回t列表上索引为2(基于0)的元素,值为until
println(t.count(s => s.length == 4)) //计算长度为4的string元素个数为3
println(t.take(2)) //返回前2个元素的t列表,值为List("Will","fill")
println(t.takeRight(2)) //返回后2个元素的t列表,值List("until","Util")
println(t.drop(2)) // 返回去掉前两个的t列表,值为List("until","Util")
println(t.dropRight(2)) //去掉后两个元素的t列表,值为List("Will","fill" )
println(t.exists(s => s == "until")) //判断是否值为"until"的字符串元素在t列表你,值为:true
println(t.filter(s => s.length == 4)) //返回长度为4的元素依次组成的新列表,值List("Will","fill","Util")
println(t.forall(s => s.endsWith("l"))) //判断是否t列表里面所有元素都一"l"结尾,值为:true
t.foreach(s => print(s)) //对t列表每一个元素执行print语句,值为:"WillfilluntilUtil"
t.foreach(print) //于上相同,不过更简洁(同上)
println(t.head) //取第一个元素
println(t.last) //取最后一个元素
println(t.tail) //取除去列表第一个元素的其他所有元素组成的列表
println(t.init) //取除去列表最后一个元素的其他所有元素组成的列表
println(t.isEmpty) //判断列表是否为空,为空true,不为空false
println(t.length) //返回列表元素数量
println(t.map(s => s + "y")) //对列表中每个元素都做一次表达式计算,并返回一个新的列表
println(t.mkString(",")) //将列表元素以,号隔开组成一个字符串
println(t.reverse) //倒转这个列表的元素
//println(t.remove(s => s.length == 4))
println(t.filterNot ( s => s.length() == 4 )) //过滤出元素长度不是4的,元素并返回,值为:List("until")
//println(t.sort((s,t) => s.charAt(0).toLowerCase < t.charAt(0).toLowerCase))
println(t.sortWith((s,t) => s.charAt(0)< t.charAt(0))) //将元素按默认排序。
println(t.partition(s=>s.length == 4)) //将元素分成满足条件长度等于4的一个list与一个不满足条件的一个list
println(t.find(s=>s.length == 4 )) //将返回第一个满足条件的元素.并包装成option类型
println(t.span(s.startsWith("W"))) //span是遍历每一个元素是否满足传入函数的条件,直到不满足的返回2个集合.(List("Will"),List("fill","until","Util")),这个函数太恶心了不知道有什么用可以自行测试
println(t.takeWhile(s.startsWith("W"))) //从第一开始直到返回false的那个元素.返回从第一个开始所有判断为true的元素
println(t.takeWhile(s.dropWith("W"))) //从第一开始直到返回false的那个元素.返回从第一个返回false的元素之后的所有元素
val i = "SB" :: t //加入一个元素返回一个新的列表
takeWhile (...) 等价于:while (...) { take }
dropWhile (...) 等价于:while (...) { drop }
span (...) 等价于:while (...) { take; drop }
三、集Set常用方法
var jetSet = Set("SB","MB")
jetSet += "NB" //加入一个元素返回一个新的集
println(jetSet.contains("NB")) //true
四、元组(Tuple)
var pair = (99,"test")
println(pair._1)//访问索引为一的元素。元组的索引从1开始
println(pair _2)
五、Map
var treasureMap = Map[Int,String]()
treasureMap += (1->"test") //添加一个key为1,value为"test"的值
treasureMap(1) //获取key为1的,value的值:"test"
treasureMap.getOrElse("key",0) //如果存在着返回这个key的value,如果不存在这个key返回一个给定默认值0
可变map:val map = new collection.mutable.HashMap[String,Int]
新增一个键值对:map("key") = 1 或 map += ( "key" -> 1)
不可变map:var map = new collection.mutable.HashMap[String,Int] //必须的var的
新增一个键值对: map += ( "key" -> 1)
已排序map:var map = collection.SortedMap[String,Int]() //不可以new它是一个抽象的
新增一个键值对: map += ( "key" -> 1)
Option类型的值通常作为Scala集合类型(List,Map等)操作的返回类型。 比如Map的get方法
六、Array、List、Set、Map、Tuple的异同
Array、List索引都是基于0的,Tuple索引是基于1的。
Array、List、Set、Map他们只能放入指定类型,Tuple可以放入任意类型。
随机生成字符串:BigInt.probablePrime(100,util.Random).toString(36)
import StringOps
charAt(0)下标为0的字符变成char类型(基于0)
take(n) 从左到右取n个
takeRight(n) 从右到左取n个
drop(n) 除去前n个返回剩余的String
dropRight(n) 除去后n个返回剩余的String
七、ArrayBuffer或Array
import scala.collection.mutable.ArrayBuffer
val a = ArrayBuffer[Int]()
a.updte(0,0) 或者 a(0) = 0 //修改下标为0的元素
a += 1 //向数组中添加元素
a ++= Array(1,2,3) //++=操作符可以添加任何集合
a.trimEnd(2) // 移除最后2个元素
a.insert(2,4) //在下标为2的位置插入4
a.insert(2,5,6,7) //在下标为2的位置插入多个元素5,6,7
a.remove(2) //移除下标为2的上的元素
a.remove(1,2) //移除索引从1开始,删除2个元素
a.count( _ > 0 ) //清点有多少的正元素
a.sum //计算元素的和
a.max //取出最大值
a.min //取出最小值
a.toArray //转换成Array
ArrayBuffer(1,2,3).copyToArray(Array(4,5)) //左边会覆盖又遍的对应下标的元素。并且左边要是右边Array的超类
1>Array
val a = Array[Int](10) //这样创建时创建一个长度为1的定长数组,这个数组里面发的是10
val a = new Array[Int](10) //new是创建一个长度为10的定长数组,默认值全部是0
val arrayToMap = Array(("1",1),("2",2)).toMap
a.toBuffer //转换成ArrayBuffer
scala.util.Sorting.quickSort(a) //a要是Array,它会修改a本身。
a.sortWith(_ < _) //对a进行从小到大排序,返回一个新的Array,不会修改原有的Array
a mkString(",") //一","号分割每个元素返回这个逗号连接的字符串
a mkString("<",",",">") //重载的方法,给前后加上指定开始符号和结束符号
八、多维数组
val arrays = Array.ofDim[Double](x,y) //x行,y列
创建一规则多维数组
val arrays = new Array[Array[Int]](10)
for(i <- 0 until arrays.length){
arrays(i) = new Array[Int](i+1)
}
**拉链操作
StringOps中的zip定义如下
abstract def zip[B](that: GenIterable[B]): StringOps[(A, B)]
GenIterable是可遍历对象需要包含的trait,对于String来说,它是可遍历的。但是它的遍历是遍历单个字母。 所
以拉链就针对每个字母来进行。