Scala函数与集合

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/takeuherat/article/details/101449542

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 // 交换对偶元组的元素,通常用作计数
      

猜你喜欢

转载自blog.csdn.net/takeuherat/article/details/101449542
今日推荐