Scala---函数式编程(匿名函数,高阶函数map,flatMap,foreach,filter,partition,fold,reduce,groupBy等)

本文介绍了Scala编程中的函数概念,包括有返回值的函数、匿名函数、高阶函数的定义与应用,以及map、flatMap、filter、partition、fold、reduce和groupBy等常见操作。同时解释了闭包的概念。
摘要由CSDN通过智能技术生成

一、作为值的函数

	//要求有返回值的函数
    val fun:(String,Int)=>(Int,String)={
      (x,y)=>(y,x)
    }
    //调用函数并赋值
    val result = fun("zhangsan",33)
    //打印输出
    println(result)

    //创建方法
    def hello(name:String)={
      println(name)
    }
    hello("hhhhh")
    //将方法转换成函数,由变量去接受,函数不能转成方法
    val res=hello _
    //赋值
    res("hhh")

二、匿名函数

没有名字的函数,就是匿名函数,将参数列表和函数体使用"=>"连接起来,其作用是对参数列表中的参数,基于函数体进行操作,并类型推断其返回值。

三、高阶函数

一个有参数的函数,其参数是一个函数,函数在其参数列表中嵌套函数,或者使用函数作为输出结果,把这种函数我们称之为高阶(high level)函数。

	//高阶函数,调用函数的函数为高阶函数
    val funn=(x:Int)=>{
      x+1
    }
    //创建方法
    def met(f:Int=>Int)={
      f(1)+22
    }

    //创建使用方法
    def useMethod(f:Int=>Int,y:Int)={
      f(y)
    }

    //调用函数
    println(funn(2))
    println(met(funn))
    println(useMethod(funn, 5))

四、常见的高阶函数

1、map,flatMap ,foreach
	//创建数组
    val arr = Array(1,2,3,4,5,6)

    //将数组当中的每一个元素扩大10倍
    println(arr.map((x:Int) => x * 10).toBuffer)
    //简化版
    println(arr.map(x => x * 10).toBuffer)
    println(arr.map(_ * 10).toBuffer)

    //flatMap = map+flatten 原集合中的一个元素(这个元素也必须是集合),会转化为多个元素
    val arr1=Array(("a",1),("b",2),("c",3))
    val re1=arr1.flatMap(x => x._2 + x._1)
    re1.foreach(println)
    //另一种方法的实现
    arr1.map(x=>x._1+x._2).foreach(println)
    arr1.map(x=>x._1+x._2).flatten.foreach(println)

    //flatMap案例
    val arr2 = Array("ai bi ci","a b","g")
    //arr2.flatMap(x=>x.split(" ")).foreach(println)
    arr2.flatMap(_.split(" ")).foreach(println)

    //foreach
    val arr3 = Array(1,2,3,4,5)
    //遍历输出
    arr3.foreach(println)
2、filter:过滤
//filter:过滤
    val arr4 = Array(6, 3, 9, 7, -2)
    //过滤出来偶数
    val array = arr4.filter(x=>x%2==0)
    println(array.toBuffer)

    //filter过滤案例
    val arr5= Array("xiaohong","xiaolan","xiaomin","axiang")
    //过滤以a开头的名字
    arr5.filter(x=>x.startsWith("a")).foreach(println)
    //过滤以g结尾的元素
    arr5.filter(x=>x.endsWith("g")).foreach(println)
    //过滤出来包含h的元素
    arr5.filter(x=>x.contains("h")).foreach(println)
    //将数组中的偶数扩大10倍
    arr.filter(x=>x%2==0).map(_*10).foreach(println)

    //DropWhile:从左侧开始删除元素,直到遇到第一个不符合条件的元素,停止返回删除后新的数组
    //arr.dropWhile(_<4).foreach(println)
    println(arr.dropWhile(_ < 4).toBuffer)
3、partition:分区

只能一分为二,满足条件的放到Tuple2中的第一个元素的位置上,不满足条件的放到Tuple2的第二个元素的位置上

    //将数组中的元素分为奇偶数
    val par = arr.partition(x=>x%2==0)
    println(par._1.toBuffer) //ArrayBuffer(2, 4, 6)
    println(par._2.toBuffer) //ArrayBuffer(1, 3, 5)
4、fold和reduce

1、fold(zeroValue)((A1, A2) => A3)就是一个聚合函数,开始A1为zeroValue,A2为集合中第一个元素,聚合的结果就是A3,那么在下一次的聚合过程中,A3就成了A1。之后每一次拿着上一次聚合的结果A1和集合中的下一个元素A2进行聚合。
2、foldRight(zeroValue)((A1, A2) => A3)就是一个聚合函数,开始A2为zeroValue,A1为集合(从右往左取)中第一个元素,聚合的结果就是A3,那么在下一次的聚合过程中,A3就成了A2。之后每一次拿着上一次聚合的结果A2和集合(从右往左取)中的下一个元素A1进行聚合。
3、reduce((A1, A2) => A3)就是一个聚合函数,开始A1,A2为集合中前两个元素,聚合的结果就是A3,那么在下一次的聚合过程中,A3就成了A1。之后每一次拿着上一次聚合的结果A1和集合中的下一个元素A2进行聚合。
4、reduceRight((A1, A2) => A3)就是一个聚合函数,开始A1,A2为集合(从右往左取)中前两个元素,A2为第一个元素,聚合的结果就是A3,那么在下一次的聚合过程中,A3就成了A2。之后每一次拿着上一次聚合的结果A2和集合(从右往左取)中的下一个元素A1进行聚合。

	//fold:简化折叠
    val fol=arr.fold(1)((sum:Int,num:Int)=>{
      println(s"$sum----$num")
      sum+num
    })
    println(fol)
    /*1----1
    2----2
    4----3
    7----4
    11----5
    16----6
    fol: Int = 22*/
    //简化版
    val fol1=arr.fold(1)((sum,num)=>sum+num)
    val fol2=arr.fold(1)(_+_)
    println(fol2)
    //相减
    val fol3=arr.fold(1)(_-_)
    val fol4=arr.fold(1)((sum:Int,num:Int)=>{
      println(s"$sum----$num")
      sum-num
    })
    /*1----1
    0----2
    -2----3
    -5----4
    -9----5
    -14----6
    fol4: Int = -20*/

    //1-1=0  0-2=-2  -2-3=-5 -5-4=-9  -9-5=-14  -14-6=-20

    //foldRight
    val fol5=arr.foldRight(0)((sum:Int,num:Int)=>{
      println(s"$sum----$num")
      sum-num
    })
    /*
    6----0
    5----6
    4-----1
    3----5
    2-----2
    1----4
    fol4: Int = -3*/

    //foldLeft与fold相同
    val fol6= arr.foldLeft(1)(_-_)
    val fol7= arr.foldLeft(1)((sum:Int,num:Int)=>{
      println(s"$sum----$num")
      sum-num
    })

    //reduce与fold相同只不过没有一个初始值
    val red=arr.reduce(_+_)

    //reduceLeft
    val result = arr.reduceLeft(_-_)
    val result1 = arr.reduceLeft((sum:Int,num:Int)=>{
      println(s"$sum----$num")
      sum-num
    })
    //打印输出
    println(result)
    //reduceRight
    val result3 = arr.reduceRight(_-_)
    val result4 = arr.reduceRight((sum:Int,num:Int)=>{
      println(s"$sum----$num")
      sum-num
    })
    /*5----6
    4-----1
    3----5
    2-----2
    1----4
    result4: Int = -3*/
    //打印输出
    println(result3)
5、groupBy
	//groupBy
    val stus = Array(
      "1,田志,male",
      "2,李威,male",
      "4,范帅,female",
      "5,郭颖丽,female"
    )

    //按照性别分组,lastIndexOf方法用于获取指定元素在集合中的最后一次出现的索引
    val gro=stus.groupBy(line => line.substring(line.lastIndexOf(",") + 1))
    //遍历输出
    gro.foreach(x=>{println(x._1)
      println(x._2.toBuffer)}
    )
    /*male
	ArrayBuffer(1,田志,male, 2,李威,male)
	female
	ArrayBuffer(4,范帅,female, 5,郭颖丽,female)*/

五、闭包

方法体当中的匿名函数运算调用了方法的参数列表就叫闭包

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值