scala高阶函数练习(非常重要)

本文介绍了Scala中高阶函数的应用,涵盖按照指定规则操作元素、聚合元素、获取特定元素、按规则分组以及过滤数据等场景。通过示例展示了如何使用高阶函数实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、定义一个高阶函数,按照指定的规则对集合里面的每个元素进行操作
比如: val arr = ArrayString
对集合中每个元素进行操作,得到集合每个元素的长度
val result = ArrayInt

object $08_Map {

 def main(args: Array[String]): Unit = {

    val arr = Array[String]("spark","hello","java","python")

    val func = (x:String)=>{
      x.length
    }

    val result = map(arr,func)
    println(result.toBuffer)
  }

  def map(arr:Array[String],func:String=>Int)={
    for (element<- arr) yield {
      func(element)
    }
  }

2、定义一个高阶函数,按照指定的规则对集合中的所有元素进行聚合
val arr =ArrayInt
求得集合中的所有元素的和
val result = xx

object $09_Reduce {

  def main(args: Array[String]): Unit = {

    val arr =Array[Int](10,2,4,6,1,8,10)

    var func = (agg:Int,curr:Int)=> agg+curr

    println(reduce(arr,func))
  }

  def reduce(arr:Array[Int],func:(Int,Int)=>Int): Int ={

    var tmp:Int = arr(0)

    for(i<- 1 until arr.length){
      tmp = func(tmp,arr(i))
    }

    tmp
  }
}

3、定义一个高阶函数,按照指定的规则获取指定元素
val arr = Array[String](“zhangsan 20 3000”,“lisi 30 4000”,“wangwu 15 3500”)
获取年龄最大的人的数据
val result = “lisi 30 4000”

object $10_MaxBy {

  /**
    * 3、定义一个高阶函数,按照指定的规则获取指定最大元素
    * val arr = Array[String]("zhangsan 20 3000","lisi 30 4000","wangwu 15 3500")
    * 获取年龄最大的人的数据
    * val result = "lisi 30 4000"
    *
    */
  def main(args: Array[String]): Unit = {
    val arr = Array[String]("zhangsan 20 3000","lisi 30 4000","wangwu 15 3500")

    val func = (x:String,y:String) => {
      val first = x.split(" ")(2).toInt
      val last = y.split(" ")(2).toInt
      if(first>last) {
        x
      }else{
        y
      }
    }
    println(maxBy1(arr, func))

    println(maxBy2(arr, (x: String) => x.split(" ")(2).toInt))
  }

  def maxBy1( arr:Array[String], func: (String,String)=> String)={

    var tmp = arr(0)

    for(i<- 1 until arr.length){
      tmp = func(tmp,arr(i))
    }

    tmp
  }

  def maxBy2( arr:Array[String],func: String=>Int) = {

    var tmp = func(arr(0))
    var result = arr(0)

    for(element<- arr){
      if(tmp<func(element)){
        tmp = func(element)
        result = element
      }
    }

    result
  }

}

4、定义一个高阶函数,按照指定的规则对数据进行分组
val arr = Array[String](“zhangsan 男 深圳”,“lisi 女 深圳”,“王五 男 北京”)
根据性别进行分组
val result = Map[String,List[String]](
“男”-> List(“zhangsan 男 深圳”,“王五 男 北京”),
“女” -> List(“lisi 女 深圳”)
)

import java.util

object $11_GroupBy {

  /**
    * 4、定义一个高阶函数,按照指定的规则对数据进行分组
    * val arr = Array[String]("zhangsan 男 深圳","lisi 女 深圳","王五 男 北京")
    * 根据性别进行分组
    * val result = Map[String,List[String]](
    * "男"-> List("zhangsan 男 深圳","王五 男 北京"),
    * "女" -> List("lisi 女 深圳")
    * )
    *
    */
  def main(args: Array[String]): Unit = {
    val arr = Array[String]("zhangsan 男 深圳","lisi 女 深圳","王五 男 北京")

    val func = (x:String) => x.split(" ")(1)
    println(groupBy(arr, func))
    println(groupBy(arr,(x:String) => x.split(" ")(1)))
    println(groupBy(arr,(x) => x.split(" ")(1)))
    println(groupBy(arr,x => x.split(" ")(1)))
    println(groupBy(arr,_.split(" ")(1)))
  }

  def groupBy( arr:Array[String],func: String=>String )={

    //1、创建一个分组的存储容器
    val result = new util.HashMap[String,util.List[String]]()
    //2、遍历集合所有元素
    for(element<- arr){
      //得到分组的key
      val key = func(element)
      //3、判断分组的key是否在容器中存在,如果不存在,则直接添加到容器中
      if(!result.containsKey(key)){
        val list = new util.ArrayList[String]()
        list.add(element)
        result.put(key,list)
      }else{
      //4、如果存在,此时应该取出key对应的List,将元素添加到List
       val list = result.get(key)
        list.add(element)
      }
    }
    //5、返回结果
    result
  }
}

5、定义一个高阶函数,按照指定的规则对数据进行过滤,保留符合要求的数据
val arr =ArrayInt
只保留偶数数据
val result = ArrayInt

object $12_Filter {

  /**
    * 5、定义一个高阶函数,按照指定的规则对数据进行过滤,保留符合要求的数据
    * val arr =Array[Int](10,2,4,6,1,8)
    * 只保留偶数数据
    * val result = Array[Int](10,2,4,6,8)
    */
  def main(args: Array[String]): Unit = {
    val arr =Array[Int](10,2,4,6,1,8)
    println(filter(arr, x => x % 2 == 0).toBuffer)
  }

  def filter( arr: Array[Int], func: Int => Boolean )={

    for(element<- arr if( func(element) )) yield {
       element
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值