scala-20-fold

作者: chen_666 | 来源:发表于2020-04-06 23:08 被阅读0次

    fold 函数将上一步返回的值作为函数的第一个参数继续传递参与运算,直到 list 中的所有元素被遍历。

    object FoldDemo01 {
      def main(args: Array[String]): Unit = {
    
        val list = List(1, 2, 3, 4)
        def minus( num1 : Int, num2 : Int ): Int = {
          num1 - num2
        }
    
        //说明
        //1. 折叠的理解和化简的运行机制几乎一样.
        //理解 list.foldLeft(5)(minus) 理解成 list(5,1, 2, 3, 4) list.reduceLeft(minus)
    
        //步骤  (5-1)
        //步骤  ((5-1) - 2)
        //步骤  (((5-1) - 2) - 3)
        //步骤  ((((5-1) - 2) - 3)) - 4 = - 5
    
        println(list.foldLeft(5)(minus)) // 函数的柯里化
    
        ////理解 list.foldRight(5)(minus) 理解成 list(1, 2, 3, 4, 5) list.reduceRight(minus)
        // 步骤 (4 - 5)
        // 步骤 (3- (4 - 5))
        // 步骤 (2 -(3- (4 - 5)))
        // 步骤 1- (2 -(3- (4 - 5))) = 3
        println(list.foldRight(5)(minus)) //
      }
    }
    

    foldLeft 和foldRight 缩写方法分别是:/:和:\

    object FlodDemo02 {
      def main(args: Array[String]): Unit = {
        val list4 = List(1, 9)
        def minus(num1: Int, num2: Int): Int = {
          num1 - num2
        }
        var i6 = (1 /: list4) (minus) // =等价=> list4.foldLeft(1)(minus)
        println("i6=" + i6)
    
        i6 = (100 /: list4) (minus) //=等价=> list4.foldLeft(100)(minus)
        println(i6) // 输出?
    
        i6 = (list4 :\ 10) (minus) // list4.foldRight(10)(minus)
        println(i6) // 输出? 2
      }
    }
    
    

    scan

    扫描,即对某个集合的所有元素做 fold 操作,但是会把产生的所有中间结果放置于一个集合中保存

    object ScanDemo01 {
      def main(args: Array[String]): Unit = {
        //普通函数
        def minus( num1 : Int, num2 : Int ) : Int = {
          num1 - num2
        }
    
        //5 (1,2,3,4,5) =>(5, 4, 2, -1, -5, -10) //Vector(5, 4, 2, -1, -5, -10)
        val i8 = (1 to 5).scanLeft(5)(minus) //IndexedSeq[Int]
        println("i8=" + i8)
    
        //普通函数
        def add( num1 : Int, num2 : Int ) : Int = {
          num1 + num2
        }
        //(1,2,3,4,5) 5 => (20,19,17,14, 10,5)
        val i9 = (1 to 5).scanRight(5)(add) //IndexedSeq[Int]
        println("i9=" + i9)
      }
    }
    
    
    object Exercise03 {
      def main(args: Array[String]): Unit = {
        val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD"
        val map2 = sentence.foldLeft(Map[Char,Int]())(charCount)
        println("map2=" + map2)
    
        //使用可变的map,效率更高.
        //1. 先创建一个可变map,作为左折叠的第一个参数
        val map3 = mutable.Map[Char,Int]()
        sentence.foldLeft(map3)(charCount2)
        println("map3=" + map3)
    
      }
    
      //使用不可变map实现
      def charCount(map:Map[Char,Int],char:Char): Map[Char,Int] = {
        map + (char -> (map.getOrElse(char,0) + 1) )
      }
    
      //使用可变map实现
      def charCount2(map:mutable.Map[Char,Int], char:Char): mutable.Map[Char,Int] = {
        map += (char -> (map.getOrElse(char,0) + 1) )
      }
    }
    

    相关文章

      网友评论

        本文标题:scala-20-fold

        本文链接:https://www.haomeiwen.com/subject/wgcwphtx.html