Scala函数与集合
可变参数与高阶函数
-
可变参数
数据类型 + * //可变参数要放在其他参数后面
eg: def add(Ints : Int*)={}
-
参数的默认值
1.参数定义时可以指定一个默认值,调用时没有参数值则使用默认值
eg: def add(a :Int=6,b:Int=6)={}
2.调用时可以传部分参数,但要指定参数名
eg:add(b=9)
3.调用时按顺序覆盖参数
eg:add(9) 指将a的值设为9
-
高阶函数
扫描二维码关注公众号,回复: 7628508 查看本文章将其他的函数作为参数或者返回值是函数的函数
-
部分参数应用函数
可以向具有多个函数参数的函数内传递任意数量的函数参数。
val partM = (x:Int) =>m(4,x)
val partM = m(x:Int, _:Int)
上面两个式子是等价的,都只传递了一个函数作为另一个函数的参数。
-
柯里化
将原来接收两个参数的函数变成新的接收一个参数的函数
def add(x:Int,y:Int)=x+y
def add(x:Int) = (y:Int)=>x+y
def add(x:Int)(y:Int)=x+y
调用第二个函数的时候应该这样调用 add(2)(3)。中间为演变过程(y:Int)=x+y为一个匿名函数,作为add的返回值
-
偏函数
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A,B]的一个实例,A代表参数类型,B代表返回值类型,常用作模式匹配
函数的参数最多传递22个,数组的collect传递的参数期望为一个偏函数。
arr.map{case i:Int =>i*10}
eg:
1.匹配值
var f :PartialFunction[String,Int]={
case “a”=>91
case _ =>0
}
2.匹配类型
var f: PartialFunction[Int,Int]={
case i:Int =>i*10 //表示如果是Int类型就返回i*10
}
-
数组与集合
-
数组的定义
1.new Array[数据类型](长度)
2.Array[数据类型](数据值)
-
map|flatten|flatmap|foreach的使用
-
map(映射)
将传入的数据经过处理转换为特定的数据
arr.map(x => x*10) //map传入的是一个有返回值的函数
-
flatten(扁平化操作)
将参数内的数据进行统一,只遵循最外层的数据类型约束
-
flatmap(map().flatten)
相当于map操作后flatten。
-
foreach
arr.foreach(x =>println(x)) //传入的为一个操作函数,对每个元素执行相同的操作
-
-
集合的常用操作
scala的集合有三大类:序列Seq,集Set,映射Map。所有的集合都扩展自Iterable特质。在Scala中集合有可变和不可变两种类型,immutable类型的集合在初始化后就不能改变了。
-
Seq(下面的例子都用DSL风格)
在scala中列表要么为空(Nil),要么是一个head元素加上一个tail列表
1.100 :: list //相当于100. :: (list) ,将前面的作为一个整体追加到后面 2.list ++ list2 //将list2的每个元素追加到list后面 3.list ++: list2 //将list2的每个元素追加到list后面 4.list +: list2 //将list作为一个整体放到list2头部 5.list :+ (list2) /将list2作为一个整体放到list后面/ 6.list :::list2 //将两个list中的每个元素组合成一个新的list
2.list.count(x=> x>8) //括号内传的是一个布尔类型,返回符合表达式元素的个数 3.list.filter(x =>x>8) //括号内传的是一个布尔类型,返回符合表达式元素的集合 4.list.sorted() //默认升序(默认调用时不需要写括号),可在括号内传参 5.list.sortBy(x=>-x) //按照什么元素进行排序(默认升序) 6.list.sortWith( (x,y) => x._2 > y._2) //按照什么方式排序,比如按照x集合的value大于y集合的value进行排序。 7.list.grouped(x =>x>3) //将x>3的分为一组 8.list.flod(1)((x,y) => x+y) //初始值为1,按照x+y的规则叠加,默认左叠加(初始值在操作左边)。可以调用flodRight右叠加。返回值类型和初始值类型相同。 9.list.reduce((x,y) =>x+y) //将x,y按照x+y的操作聚合在一起 10.list.aggergate(0)(_ + _, _+ _) //初始值为0,进行局部聚合,非并行情况下调用flodLeft方法 11.list.union(list2) //求并集 12.list.intersect (list2) //求交集 13.list.diff(list2) //求差集 14.list.head(2) //头部添加 15.list.tail(2) //尾部添加 16.list.zip() //将相同角标的元素组合成一个包含元组元素的集合 17.list.mkString("|") //将list转为String,用|隔开 18.list.length //求list长度 19.list.slice(1,3) //截出角标1-3的元素,不包括角标3的元素 20.list.sum //求和
-
Set
1.HashSet
1.add() //添加元素 2.remove() //删除元素 3.-=() //减去元素赋给set 4.++() //添加元素
2.HashMap
1.var map = Map[String,Int]("a"->1) 2.var map = collection.mutable.HashMap[String,Int]("x" ->1) 3.map.put("a",1) //添加元素 4.map+="a"->1 //添加元素 5.map+=(("b",4)) //添加元素 6.map.remove("a") //删除元素 7.map-=("a") //删除元素 8.map.get("a") //取值 9.map.getOrElse("a",0) //没有值则赋值,否则返回元素值 10.Some(100).get // 返回100,用作模式匹配
3.Tuple
1.var tup = ("a",1,true,Unit) 2.tup._num // 返回第num个元素 3.tuple.productIterator //返回一个迭代器 4.var typ=("a",4).swap // 交换对偶元组的元素,通常用作计数
-