Kotlin基础 函数式编程

一个函数式应用通常由三大类函数构成:变换transform、过滤filters合并combineo每类函数都针对集合数据类型设计,目标是产生一个最终结果。函数式编程用到的函数生来都是可组合的,也就是说,你可以组合多个简单函数来构建复杂的计算行为。

一.变换
         变换是函数式编程的第一大类函数,变换函数会遍历集合内容,用一个以值参形式传入的变换器函数,变换每一个元素,然后返回包含已修改元素的集合给链上的其他函数。
        最常用的两个变换函数是map和f|atMap。

1.map
        map变换函数会遍历接收者集合,让变换器函数作用于集合里的各个元素,返回结果是包含已修改元素的集合,会作为链上下一个函数的输入。

fun main() {
      //map的效果:返回一个列表,其中包含将给定的转换函数应用于原始集合中的每个元素的结果。
    val listOf = listOf("zebra", "giraffe", "elephant", "rat")
    //将原先集合里的元素副本取出,经过运算后返回结果(一直到最后一个map执行完)因为是副本原集合中不会改变
    val map :List<String> = listOf.map { list -> "A baby  $list" }.map { list->"$list,with the cutest little tail ever!" }
 
    print(listOf)
    print(map)
 
 // map返回的集合中的元素个数和输入集合必须一样,不过,返回的新集合里的元 素可以是不同类型的。
    val map1:List<Int> = listOf.map { it.length }
     print(map1)
}


        可以看到,原始集合没有被修改,map变换函数和你定义的变换器函数做完事情后,返回的是一个新集合,这样,变量就不用变来变去了。

        事实上,函数式编程范式支持的设计理念就是不可变数据的副本在链上的函数间传递。

2.flatMap
          flatMap函数操作一个集合的集合,将其中多个集合中的元素合并后返回一个包含所有元素的单一集合。   

fun main() { 
         //把子集合里的元素合并到一个一个集合里                     filter过滤集合中含有某个元素的属性
    val result =listOf(listOf("4", "1", "0"), listOf("5", "3")).flatMap { it -> it }
    print(result)
 
}


二.过滤
        过滤是函数式编程的第二大类函数,过滤函数接受一个predicate函数,用它按给定条件检查接收者集合里的元素并给出true或fa|se的判定。如果predicate函数返回true,受检元素就会添加到过滤函数返回的新集合里。如果predicate函数返回false,那么受检元素就被移出新集合。
 

1.filter
        过滤集合中元素含有”123“字母的元素。

fun main() {
// filter过滤集合中含有某个元素的属性
    val result= listOf("452162123", "123", "312").filter { it.contains("123") }
    print(result)
}


        filter过滤函数接受一个predicate函数,在f|atMap遍历它的输入集合中的所有元素时,filter函数会让predicate函数按过滤条件,将符合条件的元素都放入它返回的新集合里。最后,能tMap会把变换器函数返回的子集合合并在一个新集合里。

fun main() { 
 //把子集合里的元素合并到一个一个集合里                     filter过滤集合中含有某个元素的属性
    val result =
        listOf(listOf("452162123", "123", "312"), listOf("512", "3214512")).flatMap { it -> it.filter { it.contains("123") } }
    print(result)
}


      找素数,除了2和它本身,不能被任何数整除的数。仅使用了几个简单函数,我们就解决了找素数这个比较复杂的问题,这就是函数式编程的独特魅力:每个函数做一卢组合起来就能干大事。

fun main() {
 val intListOf = listOf(7, 4, 8, 4, 3, 22, 18, 11)   
//取出了从2到它本身之间不能被自己整除的数
    val filter =
        intListOf.filter { number -> (2 until number).map { number % it }.none { it == 0 } }
 
    print(filter)
}


三.合并
        合并是函数式编程的第三大类函数,合并函数能将不同的集合合并成一个新集合,这和接收者是包含集合的集合的flatMap函数不同。

1.zip
        zip合并函数来合并两个集合,返回一个包含键值对的新集合。

fun main() { 
val key = listOf("xiaohua", "xiaogang", "xiaohong")
    //合并
    val ageList = listOf(20, 21, 22)
    val toMap = key.zip(ageList).toMap()
    println(toMap["xiaohua"])
}


2.fold
        另一个可以用来合并值的合并类函数是fold,这个合并函数接受一个初始累加器值,随后会根据匿名函数的结果更新。

fun main() {
 //initial 集合刚运算开始前回乘集合的第一位数字一次  accmulaor每次运算的值   number集合中的值
    val fold = listOf(1, 2, 3, 4, 5).fold(2) { accmulaor, number ->
        print("Accmulaor value:$accmulaor \n")
        accmulaor + (number * 3)
    }
 print(fold)
}

四.序列
        List、Set、Map集合类型,这几个集合类型统称为及早集合(eager collection)这些集合的任何一个实例在创建后,它要包含的元素都会被加入并允许你访问。对应及早集合,Kin还有另外一类集合:惰性集合(lazy collection)类似于类的惰性初始化,惰性集合类型的性能表现优异,尤其是用于包含大量元素的集合时,因为集合元素是按需产生的。

        Kotlin有个内置惰性集合类型叫序列(Sequence),序列不会索引排序它的内容,也不记录元素数目,事实上,在使用一个序列时,序列里的值可能有无限多,因为某个数据源能产生无限多个元素。

猜你喜欢

转载自blog.csdn.net/liujun3512159/article/details/128090862