Scala10_集合03_集合高阶方法

1.reduce

1.Scala中对数据的操作一般都是两两计算
在这里插入图片描述

object Scala10_Collection_reduce {
  def main(args: Array[String]): Unit = {
    //TODO 集合 - 计算方法 - 聚合功能函数
    //Scala集合提供了一些用于聚合数据功能的函数
    //但是聚合逻辑不确定
    // 1->N flatMap
    // N->1 reduce (聚合)

    //todo 1.reduce 将集合中的元素两两聚合,聚合规则自己制定
    val list = List(1, 2, 3, 4)
    //参数是(A1,A1)=>A1
    //Scala中数据操作一般都是两两操作
    val i: Int = list.reduce((x, y) => x + y)
    println(i)//10
  }
}

2.reduceLeft&reduceRight

在这里插入图片描述

object Scala10_Collection_reduce {
  def main(args: Array[String]): Unit = {
    //TODO 集合 - 计算方法 - 聚合功能函数
    //Scala集合提供了一些用于聚合数据功能的函数
    //但是聚合逻辑不确定
    // 1->N flatMap
    // N->1 reduce (聚合)

    //todo 1.reduce 将集合中的元素两两聚合,聚合规则自己制定
    val list = List(1, 2, 3, 4, 5)
    //参数是(A1,A1)=>A1   两个操作数和返回值类型一致
    //Scala中数据操作一般都是两两操作
    val i: Int = list.reduce(_-_)//-1 -4 -9 -13
    println(i)//10

    //todo 2.reduceLeft
    //参数: (A,B)=>A   两个操作数类型可以不一致,返回值和第一个操作数一致
    val i1: Int = list.reduceLeft(_ - _) //-1 -4 -9 -13
    println(i1)

    //todo 3.reduceRight
    // 先反转,再reduceLeft  (5,4,3,2,1)
    val i2: Int = list.reduceRight(_ - _) //-1 4 -2 3
    println(i2)

    //todo 4.理解reduceLeft和reduceRight
    //reduceLeft从左加括号  ((((1, 2), 3), 4), 5)  再将逗号变为运算符  结果即:  -1 -4 -5 -10
    //reduceRight从右加括号 (1, (2, (3,( 4, 5))))                           -1 4 -2 3
  }
}

reduce方法总结

  1. 三个方法底层都是reduceLeft
  2. reduce : (A,A)=>A
  3. reduceLeft: (B,A)=>B
  4. reduceRight: 从右往左加括号

3.fold

reduce系列的方法是一个集合内部做聚合;
现在需要做集合之间的聚合;

object Scala11_Collection_fold {
  def main(args: Array[String]): Unit = {
    //todo fold 折叠  聚合多个集合
    //fold 函数柯里化,两个参数列表
    //第一个参数列表是 集合外的数据,是初始值
    //第二个参数列表表示数据两两计算的规则
    val list = List(1,2,3,4,5)
    val i: Int = list.fold(0)(_ - _) // 0,1,2,3,4,5
    println(i)//-15

    //fold(z:A)((A,A)=>A)
    //foldLeft(z:B)((B,A)=>B)
    //foldRight   reversed.foldLeft(z)((x,y)=> op(y,x))
    val i1: Int = list.foldRight(0)(_ - _)  //  1,2,3,4,5,0 然后就是reduceRight过程了
    println(i1)//3


    //todo Scan 保留每一步操作的结果到List中
    val ints: List[Int] = list.scanRight(5)(_ - _) //1,2,3,4,5,5
    println(ints) //List(-2, 3, -1, 4, 0, 5)

  }
}

4.List自定义排序

object Scala16_Collection_SortBy {
  def main(args: Array[String]): Unit = {
   val user1 = new User()
   user1.id = 1
    user1.age = 10

    val user2 = new User()
    user2.id = 2
    user2.age = 20

    val user3 = new User()
    user3.id = 2
    user3.age = 30

    val list = List(user1,user2,user3)

    //list.sortBy(_.id)

    //todo sortWith List的方法,自定义排序
    //两个两个排,排序方式符合预期返回true
    val users: List[User] = list.sortWith(
      (left, right) => {
        if (left.id < right.id) {
          true
        } else if (left.id > right.id) {
          false
        } else {
          left.age > right.age
        }
      }
    )

    println(users)
    //List(User[1][10], User[2][30], User[2][20])
  }


  class User{
    var id : Int = _
    var age : Int = _

    override def toString: String = {
      s"User[${id}][${age}]"
    }
    }
}

5.练习题

    val map1 = Map("a" -> 1, "b" -> 2)
    val map2 = Map("a" -> 3, "c" -> 4)
合并成 Map("a" -> 4, "b" -> 2,"c" -> 4)

分析
两个map做聚合,肯定用fold了
将一个map做初始值;另一个map做遍历聚合
初始值为map类型,map中元素为kv类型,肯定不一致,肯定用foldLeft了
每个元素和map的聚合逻辑就是 有则+v,无则+0

object Scala12_Collection_练习 {
  def main(args: Array[String]): Unit = {
    val map1 = Map("a" -> 1, "b" -> 2)
    val map2 = Map("a" -> 3, "c" -> 4)

    // Map("a" -> 4, "b" -> 2,"c" -> 4)
    val stringToInt: Map[String, Int] = map1.foldLeft(map2)(
      (map, t) => {
        map.updated(t._1, map.getOrElse(t._1, 0) + t._2)
      }
    )
    println(stringToInt)  //Map(a -> 4, c -> 4, b -> 2)

  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值