美文网首页
函数式编程

函数式编程

作者: 井底蛙蛙呱呱呱 | 来源:发表于2021-11-16 09:18 被阅读0次

    所谓的函数式编程指的是方法的参数列表可以接收函数对象

    在编写spark、flink时,常常会用到函数式编程。下面这些操作是学习的重点。

    函数名 功能
    foreach 用来遍历集合的,接受一个函数对象,函数的参数为集合的元素,返回值为空
    map 用来对集合进行转换的
    flatMap 用来对集合进行映射扁平化操作。扁平化操作可以理解为先map,然后flatten
    filter 用来过滤出指定的元素
    sorted 用来对集合元素进行默认排序
    sortBy 用来对集合按照指定字段排序
    sortWith 用来对集合进行自定义规则排序
    groupBy 用来对集合元素按照指定条件分组,返回一个映射Map[K, List[A]],K为分组字段,List为这个分组字段对应的一组数据
    reduce 用来对集合元素进行聚合计算,最终得到一个聚合元素
    fold 用来对集合元素进行折叠计算,最后得到一个聚合元素。与reduce的不同时他提供了一个初始元素

    实例:

    // foreach
    val lst = (1 to 10).toList
    // 简写版:lst.foreach(println)
    lst.foreach((x:Int) => {println(x)})
    
    // 如果函数参数只在函数体中出现一次,并且函数体没有涉及到复杂的使用,此时就可以使用下划线(_)的方式来优化函数定义
    
    // map, map[返回类型](f: (A) => B)
    // val lst2 = lst1.map(x => "*" * x)
    val lst2 = lst1.map((x:Int) => {"*" * x})
    
    // flatMap
    val lst3 = List("PHP is Best in the world", "fuck C++")
    val lst4 = lst3.flatMap(x => x.split(" "))
    // 相当于 lst3.map(x => x.split(" ")).flatten
    
    // filter
    val lst5 = (1 to 10).toList
    val lst6 = lst5.filter(_%2 == 0)
    
    // sorted
    val lst7 = List(3, 1, 2, 9, 7)
    val lst8 = lst7.sorted
    // 降序排序,reverse逆转即可
    val lst9 = lst8.reverse
    
    // sortBy
    val lst10 = List("1-php", "3-python", "2-scala")
    val lst11 = sortBy(x => x.split("-")(0))
    
    // sortWith,降序排列
    val lst12 = lst7.sortWith( (x1, x2) => x1>=x2)
    
    // groupBy
    val lst13 = List("Jack"->"male", "Lucy"->"female", "Mike"->"male")
    val map1 = lst13.groupBy(x => x._2)  // Map("male"->List("Jack", "Mike"), "female" => List("Lucy")
    // 统计每个组中元素的个数
    val map2 = map1.map(x => x._1 -> x._2.size) // Map("female"->1, "male"->2)
    
    // 聚合操作
    // reduce, x表示聚合后的结果,y表示后一个元素
    val lst14 = lst7.reduce((x, y) => x+y)  // 将列表的数相加
    // reduceRight
    val lst15 = lst7.reduceRight((x, y) => x-y)
    val lst16 = lst8.reduceLeft((x,y) => x-y)
    
    // fold, foldRight, foldLeft
    val lst17 = List(1, 2, 3)
    val lst18 = lst17.fold(10)((x, y) => x+y)  // 16
    

    相关文章

      网友评论

          本文标题:函数式编程

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