文章目录

  • 一丶高阶函数
  • 二丶内联函数
  • 三丶几个有用的高阶函数
  • 四丶集合变化与序列
  • 五丶SAM 转换
  • 六丶案例:统计字符个数
  • 七丶案例:HTML SDL
  • 八丶实践:体验 Gradle Kotlin DSL
  • 九丶本章小结

一丶高阶函数

package chapter01// region + 折叠
fun main(){/*高阶函数的调用*///如果括号里的函数类型作为最后一个参数,可移到括号外面//it 是Lambda的特性intArray.forEach(){println("Hello $it")}//等价于intArray.forEach{println("Hello $it")}}
// endregion/*高阶函数*/
// region + 折叠
//特征一:  block:()->Unit  ——  参数包含函数类型
//特征二:返回值为函数类型
fun needsFunction(block:()->Unit){block()
}
// endregion//  常见的高阶函数一:
//IntArray.forEach  ——  扩展方法
//action:(Int) -> Unit  ——  接收函数类型作为参数
inline fun IntArray.forEach(action:(Int) -> Unit):Unit{//action(element)   ——  调用函数actionfor(element in this) action(element)
}//  常见的高阶函数二:
//R ——  返回值元素类型
//transform:(Int)->R    ——  接收函数类型作为参数
inline fun <R>IntArray.map(transform:(Int)->R):List<R>{//transform ——  进一步传递 transformreturn mapTo(ArrayList<R>(size),transform)
}

二丶内联函数

package chapter02fun main(){/*内联函数的概念*///通过 inline标记val ints = intArrayOf(1,2,3,4)ints.forEach {println("Hello $it")}/*内敛高阶函数的return*/val ints = intArrayOf(1,2,3,4)ints.forEach {//return@forEach 跳出这一次内联函数调用 与 Java Continue 一样if (it == 3)return@forEachprintln("Hello $it")}/*non-local return*/nonLocalReturn {return //△表示:并不是退出Lambda表达式,而是从 外部 函数(main)返回}}inline fun IntArray.forEach(action:(Int)->Unit):Unit{for (element in this) action(element)
}/*定义内联函数*/
inline fun hello(){println("Hello")
}/*non-local return*/
inline fun nonLocalReturn(block:()->Unit){block()
}/*non-local return*///不合法的情况
inline fun Runnable(block: () -> Unit):Runnable{return object :Runnable{override fun run() {//不合法处原因:1、有可能存在不合法的 non-local return2、因为 block 的调用处与定义处不在同一个调用上下文//其实return 的是 run 而不是Runnableblock()}}}//解决方法一:
//禁止 non-local return
inline fun Runnable(crossinline block: () -> Unit):Runnable{return object :Runnable{override fun run() {block()}}
}//解决方法二:
//禁止函数参数被内敛
inline fun Runnable(noinline block: () -> Unit):Runnable{return object :Runnable{override fun run() {block()}}
}/*内联属性*/
//含义:  没有 backing-field 的属性 getter/setter 可以被内联
//举例:
var pocket.Double = 0.0
var money.Doubleinline get() = pocketinline set(value){pocket = value}/*内联函数的限制*/
//1、public/protected 的内联方法只能访问对应类的 public 成员
//2、内联函数的内联参数不能被存储(赋值给变量)
//3、内联函数的内联函数参数只能传递给其他内联函数参数

三丶几个有用的高阶函数

package chapter03import java.io.Filefun main(){val person = Person("benny",20)//let举例:返回表达式结果// '::' 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法person.let(::println)//run举例:返回表达式结果person.run(::println)//also举例:返回Receiverval person2 = person.also {it.name = "hhh"}//apply举例:返回Receiverval person3 = person.apply {name = "xxx"}//use举例:自动关闭资源File("build.gradle").inputStream().reader().buffered().use {println(it.readLine())}}/*几个有用的函数*/
//  let、run、also、apply、use
//举例class Person(var name:String,var age:Int){}

四丶集合变化与序列

package chapter04import java.lang.StringBuilderfun main(){/*filter 变换(序列)*///Java版本:list.stream().filter(e->e%2 == 0)
//    等价于//kotlin版本一://asSequence()转换为懒汉式list.asSequence().filter{it % 2 == 0}//kotlin版本二:list.filter{it % 2 == 0}/*map 变换*///Java版本:list.stream().filter(e->e%2 == 0)//kotlin版本一:list.map{it*2+1}//kotlin版本二:list.asSequence().map{it*2+1}/*flatMap变换*/
//    flatMap概念:用一个元素映射成一个集合,再把这个集合拼接起来得到新的集合
//    Map概念:把里面的元素映射成新的元素,那么这些元素组成的集合就成为Map集合
//    写法一:val list = listOf(1,2,3,4)list.flatMap {(0 until it)}.joinToString().let(::println)//    写法二:list.asSequence()       //将集合变成一个序列.flatMap {(0 until it).asSequence()   //结果也应该要变成一个序列}.joinToString().let(::println)/*集合的聚合操作举例*///1、sum —— 所有元素求和//2、reduce 将元素一次按规则聚合,结果于元素类型一致//3、fold —— 给定初始化值,将元素按规则聚合,结果与初始化值类型一致/*fold操作*///acc —— 每一次拼接后的结果//i —— 遍历的list集合里的每一个元素list.fold(StringBuilder()){//acc.append(i) —— 返回值类型为StringBuilder,作为下一个元素的 accacc,i -> acc.append(i)}/*恶汉式举例*///概念:会分别在filter里马上遍历List集合,在往下走到map集合时就会马上调用list进行映射,再到forEach//区别:filter{}与map{}还有flatMap{}会立即调用//代码运行结果:0 1 2 3 4 0 1 2 3 4 5 6 7 8list.filter {it % 2 == 0}.map {it * 2 + 1}.flatMap {0 until it}.forEach(::println)/*懒序列举例:*///概念:集合里的元素只有通过了一个才能继续往下走//区别:forEach 时才会调用filter{}与map{}还有flatMap{}//forEach —— 在这里就像是一个钥匙,如果没有这句代码打开水管,那上面的三个函数就像被堵住一样都不会调用//代码运行结果:0 1 2 3 4 0 1 2 3 4 5 6 7 8list.asSequence().filter {it % 2 ==0}.map {it *2 +1}.flatMap {(0 until it).asSequence()}.forEach(::println)}

五丶SAM 转换

package chapter05fun main(){//Java中的lambda表达式是没有自己的类型的,而且只能接口里只能有一个方法//kotlin实际上时创建一个 Runnable 包装了一下Lambda,并非直接转换
}

六丶案例:统计字符个数

package chapter06import java.io.Filefun main(){//打开文件build.gradle,阅读文本,string 类型File("build.gradle").readText().toCharArray()  //把它们char类型数组.filter { !it.isWhitespace() }  //过滤空白字符.groupBy { it } //it 是charArray里的每一个字符,通过it来分组,得到key 就是 char.map {it.key to it.value.size     //映射}.let {print(it)}
}

七丶案例:HTML SDL

八丶实践:体验 Gradle Kotlin DSL

九丶本章小结

Kotlin基础学习第6章—高阶函数相关推荐

  1. Python学习笔记__4.1章 高阶函数

    # 这是学习廖雪峰老师python教程的学习笔记 1.概览 我们知道Python内置的求绝对值的函数是abs() # 调用abs()函数可以获得一个值 >>> abs(-10) 10 ...

  2. Python编程基础:第五十二节 高阶函数High Order Functions

    第五十二节 高阶函数High Order Functions 前言 实践 前言 高阶函数的使用包含两种情况,一种是将另一个函数作为参数,另一种是返回一个函数. 实践 我们先来讲解第一种情况,一个函数将 ...

  3. 前端学习(1118):高阶函数

  4. Kotlin基础 9 - 高阶函数

    高阶函数的基本概念 1.传入或者返回函数的函数 2.函数引用 ::println 3.带有Receiver的引用 pdfPrinter:println fun main(args: Array< ...

  5. Kotlin基础学习(1)

    Kotlin基础学习(1) 本文主要讲解kotlin的部分基础知识,并不是全部基础. 提示:纯属个人理解,如有理解错误,欢迎留言指正批评. 一.Null检查机制 kotlin对于声明可为空的参数,使用 ...

  6. Kotlin 使用高阶函数实现回调

    lambda 和 高阶函数 之前学习了 lambda 和高阶函数,然后在 android 开发中对 onClick 事件进行监听是一个很常用的功能,kotlin 的常规实现如下: rootView.s ...

  7. kotlin修炼指南8—集合中的高阶函数

    点击上方蓝字关注我,知识会给你力量 Kotlin对集合操作类新增了很多快捷的高阶函数操作,各种操作符让很多开发者傻傻分不清,特别是看一些Kotlin的源码或者是协程的源码,各种眼花缭乱的操作符,让代码 ...

  8. Kotlin高阶函数及Lambda表达式实现接口回调

    文章目录 什么是高阶函数? Lambda 表达式 使用Kotlin高阶函数实现接口回调 Java中接口使用 Kotlin中接口使用 什么是高阶函数? 高阶函数是将函数作为参数或者返回值的函数. 特点 ...

  9. Python学习日志10 - 高阶函数和高级应用

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志10课 - 高阶函数 ...

  10. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

最新文章

  1. centso7 install Mariadb
  2. eclipse安装ADT插件重启后不显示Android SDK Manager和Android Virtual Device Manager图标的一种解决办法
  3. 游戏数据的捕捉(郁金香学习笔记)
  4. BZOJ3239 Discrete Logging
  5. collection集合 多少钱_Java 集合(2)-- Iterator接口源码超级详细解析
  6. 使用TPU的注意事项
  7. C和汇编-----for循环
  8. 运维实战案例之“Too many open files”错误与解决方法
  9. win7 vs2010 安装cocos2d-x
  10. 【转】健康,运动,习惯
  11. perl 的调试和性能测试
  12. paip.mysql 全文索引查询空白解决
  13. 前程无忧岗位数据爬取+Tableau可视化分析
  14. 在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
  15. ISO 27001,能给企业带来哪些好处?
  16. 企业数字化转型:数字化成熟度评估模型
  17. java安装_Java开发人员应该知道的7种新工具
  18. 三菱Q系列PLC基本指令讲解
  19. (朴灵著) 深入浅出node.js_朴灵 (2013) 深入浅出Node.js. 人民邮电出版社, 北京.
  20. 【图像增强】基于Frangi滤波器实现血管图像增强附matlab代码

热门文章

  1. 《Unity_5.X_3D游戏开发技术详解与典型案例》pdf
  2. Python学习之购物车
  3. struts2 result随笔
  4. Android ListView显示底部的分割线
  5. Axure总结和感想
  6. 桥牌笔记:一定要飞张?
  7. CUDA 和 GPU
  8. ACL2021 | 一种巧妙解决NER覆盖和不连续问题的方法
  9. 真实场景下如何解决类别不平衡问题
  10. 【清华ACL2020长文】KdConv:多领域知识驱动的中文多轮对话数据集