《Kotlin核心编程》2021版复习记录

目录

    • 0 前言
    • 1 基础语法
      • 1.1 数据类型
      • 1.2 数组
      • 1.3 集合
      • 1.4 遍历数据和集合
      • 1.5 函数声明返回值类型
      • 1.6 var 和 val
    • 2 高阶函数和lambda表达式
      • 2.1 高阶函数
      • 2.2 方法和成员引用
      • 2.3 链式调用
      • 2.4 扩展函数
      • 2.5 面向表达式编程
        • 2.5.1 when表达式
        • 2.5.2 for循环
        • 2.5.3 in
      • 2.6 字符串相等
    • 3 面向对象
      • 3.1 类
        • 3.1.1 接口注意事项
      • 3.2 初始化
      • 3.3 构造方法
      • 3.4 类访问控制
      • 3.5 使用final真的好吗
      • 3.6 类访问修饰符
        • 3.6.1 访问修饰符和java比较
      • 3.7 多继承相关
        • 3.7.1 get 和 set
        • 3.7.2 内部类解决多继承问题
        • 3.7.2 委托代替多继承
      • 3.8 data class 数据类
      • 3.9 Pair和Triple
      • 3.10 伴生对象
      • 3.11 天生的单例 object
    • 4 代数数据类型和模式匹配
      • 4.1 代数类型
      • 4.2 模式匹配
    • 5 类型系统
      • 5.1 null
      • 5.2 ?:操作符
      • 5.3 Any?
      • 5.4 kotlin中装箱和拆箱
      • 5.5 泛型
      • 5.6 泛型擦除
      • 5.7 协变
    • 6 lambda和集合
      • 6.1 调用java的函数式接口
      • 6.2 with和apply
      • 6.3 map
      • 6.4 filter和count
      • 6.5 别样的求和方式:sumBy、sum、fold、reduce
      • 6.6 分组groupBy
      • 6.7 扁平化,处理嵌套集合flatten、flatMap
      • 6.8 集合继承关系
      • 6.9 可变集合和只读集合
      • 6.10 惰性集合
        • 6.10.1 序列
        • 6.10.2 序列和链式调用区别
        • 6.10.3 序列是无限的
      • 6.11 内联函数
        • 6.11.1 避免使用内联函数的情形
      • 6.12 非局部返回
      • 6.13 具体化参数类型
    • 7 多态和扩展
      • 7.1 子类型多态
      • 7.2 参数多态
      • 7.3 对类进行扩展
      • 7.4 run、let、also、takeIf
      • 7.5 扩展注意事项
    • 8 元编程(反射)
      • 8.1 程序和数据
      • 8.2 常见的元编程方法
      • 8.3 反射
      • 8.4 注解
      • 8.5 注解处理器
    • 9 设计模式
      • 9.1 创建型模式
        • 9.1.1 工厂模式
      • 9.1.2 构造者模式Builder
      • 9.2 行为型模式
        • 9.2.1 观察者模式
        • 9.2.1 策略模式
        • 9.2.2 责任链模式
      • 9.3 结构性模式
        • 9.3.1 装饰者模式
      • 10 函数式编程
      • 11 异步和并发

0 前言

准备先回顾一下kotlin。
每天看到哪里就会写到哪里,随缘记录一下我觉得比较常用的思想和知识点。暂时粗略过一遍,方面查看。后续有时间再仔细看看;
争取不和学flutter一样暂时烂尾hh。

1 基础语法

1.1 数据类型

和java一样Byte、Short、Int、Long、Float、Double、Char、Boolean 但是没有包装类型。


val a: String = "Hello, World!"

1.2 数组

IntArray 是Kotlin中表示原生整型数组(int[])的一个类型别名

val intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)
val doubleArray: DoubleArray = doubleArrayOf(1.1, 2.2, 3.3)
val stringArray: Array<String> = arrayOf("Kotlin", "Java", "Python")

1.3 集合

val list = mutableListOf("Kotlin", "Java", "Python")
val set = mutableSetOf("Kotlin", "Java", "Python")
val map: MutableMap<Int, String> = mutableMapOf(1 to "Kotlin", 2 to "Java", 3 to "Python")

1.4 遍历数据和集合

// 部分遍历
intArray.forEachIndexed{ index, value ->println("$index : $value")}
for ((i,j) in intArray.withIndex()){println("$i : $j")
}
map.forEach {println("${it.key} : ${it.value}")
}

1.5 函数声明返回值类型

声明返回值为Int类型,有时候可以不用声明,但是我一般为了避免错误,还是都会显示声明。

fun sum(x: Int,y: Int): Int  = x + y

1.6 var 和 val

var 变量
val 引用不可变,对照java中用了final关键字。
开发中优先使用val,val不行再用var

2 高阶函数和lambda表达式

2.1 高阶函数

高阶函数就是函数的入参或返回值也是函数的函数。

 (Int) -> Unit

通过 -> 来组织参数类型和返回值类型,左边是参数,右边是返回值。
多个参数

 (Int,String) -> Unit

还可以给参数指定名字

  (x: Int,y: String?) -> Unit

如果这个函数变量作为参数也是可不选(为空)

 ( (x: Int,y: String?) -> Unit)?

2.2 方法和成员引用

val p1 = ::Person
p1("tian", 18).test()

2.3 链式调用

fun add(x: Int,y: Int,z: Int) = {x+y+z
}
fun add(x: Int) = { y: Int ->{z: Int -> x+y+z}
}

一般函数有多个参数,然后最后一个参数为函数的时候可以柯里化。 就是用直接{
}。

2.4 扩展函数

fun View.invisible(){this.visibility = View.INVISIBLE
}

2.5 面向表达式编程

在这里插入图片描述
表达式:可以返回值的语句。

在这里插入图片描述

2.5.1 when表达式

在这里插入图片描述

2.5.2 for循环
for(i in 1..5 step 2) {println(i)
}
for(i in 5 downTo 1) {if(i == 3) breakprintln(i)
}for(i in 1 until 5) {if(i == 3) continueprintln(i)
}
val list4 = listOf(1,2,3)
list4.forEach {println("it: $it")
}list4.forEachIndexed { index, element ->println("$index: $element")
}
for ((index,value) in list4.withIndex()){println("$index: $value")
}
2.5.3 in
val flag = 1 in listOf(1,3,4)
println(flag)

2.6 字符串相等

==用来比较值
===用来比较引用

3 面向对象

3.1 类

和java区别
在这里插入图片描述

3.1.1 接口注意事项

在这里插入图片描述

3.2 初始化

init语句块
延迟初始化 lateinit和by lazy
by lazy 需要和val 连用,也就是引用不可变
在这里插入图片描述

lateinit 则是用于var,而且不能用于基本类型,如Int、Long等
在这里插入图片描述

3.3 构造方法

在这里插入图片描述
从构造方法需要直接或者间接委托给主构造方法。

3.4 类访问控制

类和方法默认不可继承或重写,需要加上open关键字 (final修饰)
继承和接口实现都是用:

3.5 使用final真的好吗

在这里插入图片描述

3.6 类访问修饰符

在这里插入图片描述
internel

在这里插入图片描述

内部类使用private修饰

在这里插入图片描述

3.6.1 访问修饰符和java比较

在这里插入图片描述

3.7 多继承相关

骡马问题
继承骡马的后代继承谁的run方法?
有歧义

在这里插入图片描述

3.7.1 get 和 set

在这里插入图片描述

3.7.2 内部类解决多继承问题

需要inner
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.7.2 委托代替多继承

委托 ,调用A的A方法,其实是B类的A方法来执行
在这里插入图片描述

3.8 data class 数据类

3.9 Pair和Triple

在这里插入图片描述

3.10 伴生对象

companian object
类似static,但不是真的static
如果真static需要有@jvm…的一个注解

3.11 天生的单例 object

object 表达式
在这里插入图片描述
在这里插入图片描述

4 代数数据类型和模式匹配

4.1 代数类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 模式匹配

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5 类型系统

5.1 null

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2 ?:操作符

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5.3 Any?

在这里插入图片描述

5.4 kotlin中装箱和拆箱

在这里插入图片描述

在这里插入图片描述

5.5 泛型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.6 泛型擦除

5.7 协变

6 lambda和集合

6.1 调用java的函数式接口

在这里插入图片描述
在这里插入图片描述

6.2 with和apply

在这里插入图片描述
在这里插入图片描述

6.3 map

在这里插入图片描述
在这里插入图片描述

6.4 filter和count

在这里插入图片描述
在这里插入图片描述

6.5 别样的求和方式:sumBy、sum、fold、reduce

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.6 分组groupBy

在这里插入图片描述

6.7 扁平化,处理嵌套集合flatten、flatMap

以后再看

6.8 集合继承关系

在这里插入图片描述

6.9 可变集合和只读集合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
和java互操作时候注意:
在这里插入图片描述

6.10 惰性集合

6.10.1 序列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.10.2 序列和链式调用区别

在这里插入图片描述

6.10.3 序列是无限的

在这里插入图片描述

6.11 内联函数

主要是优化lambda表达式带来的开销
在这里插入图片描述
在这里插入图片描述
简单来说就是编译过程中把函数放到该调用的位置,避免额外生成类和调用的开销。

6.11.1 避免使用内联函数的情形

在这里插入图片描述
不内联
noinline

6.12 非局部返回

在这里插入图片描述
在这里插入图片描述

6.13 具体化参数类型

在这里插入图片描述

7 多态和扩展

7.1 子类型多态

在这里插入图片描述

7.2 参数多态

在这里插入图片描述

7.3 对类进行扩展

不会修改类本身,避免类被污染。
扩展函数不会带来额外的性能消耗。

7.4 run、let、also、takeIf

run
在这里插入图片描述
let
在这里插入图片描述
also
在这里插入图片描述
takeIf
在这里插入图片描述

7.5 扩展注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8 元编程(反射)

8.1 程序和数据

在这里插入图片描述元编程就像⾼阶函数⼀样,是⼀种更⾼阶的抽象,⾼阶函数将函数作为输⼊或输出,⽽元编程则是将程序本⾝作为输⼊或输出。
在这里插入图片描述

8.2 常见的元编程方法

kotlin中主要还是反射

8.3 反射

8.4 注解

在这里插入图片描述

8.5 注解处理器

9 设计模式

在这里插入图片描述

9.1 创建型模式

在这里插入图片描述

9.1.1 工厂模式

在这里插入图片描述

在这里插入图片描述

用单例代替工厂类
在这里插入图片描述

伴⽣对象创建静态工厂方法
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

9.1.2 构造者模式Builder

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.2 行为型模式

在这里插入图片描述

9.2.1 观察者模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.2.1 策略模式

在这里插入图片描述

9.2.2 责任链模式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

9.3 结构性模式

在这里插入图片描述

9.3.1 装饰者模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10 函数式编程

11 异步和并发

回调地狱

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400935.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手撕初阶数据结构之---排序

1.排序概念及运用 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的操作。 常见的排序算法 直接插入排序的时间复杂度是O(N^2) 这个是最差的情况下&#xff0c;就是大的在前面&#xff…

被老韭菜阴阳了?未来一个人最核心的能力:守脑如玉——早读(逆天打工人爬取热门微信文章解读)

tomato 版本TO&#xff1f; 引言Python 代码第一篇 洞见 未来一个人最核心的能力&#xff1a;守脑如玉第二篇 股友见闻结尾 &#xff08;你看出本质了吗&#xff1f;&#xff09; 引言 昨晚听别人的分析 好神奇 我会惊叹 为什么大家看到的都是同样的东西 而别人进行思考 思考…

Python 在PDF中添加条形码、二维码

在PDF中添加条码是一个常见需求&#xff0c;特别是在需要自动化处理、跟踪或检索PDF文件时。作为一种机器可读的标识符&#xff0c;PDF中的条码可以包含各种类型的信息&#xff0c;如文档的唯一标识、版本号、日期等。以下是一篇关于如何使用Python在PDF中添加条形码或二维码的…

Python开源项目周排行 2024年第13周

#2024年第13周2024年8月5日1roop一款基于深度学习框架TensorFlow和Keras开发的单图换脸工具包&#xff0c;提供了丰富的功能和简洁易用的界面&#xff0c;使得用户可以轻松实现单图换脸操作。支持多张人脸替换成同一个人脸&#xff0c;勾选多人脸模式即可 人脸替换 高清修复自…

SPDK源码剖析一hello_world程序

SPDK初识之hello_world程序分析 首先是hello_world程序整体框架分析 int main(int argc, char **argv) {rc parse_args(argc, argv, &opts);if (spdk_env_init(&opts) < 0) { // spdk环境初始化&#xff0c;最终调用dpdk环境初始化}// 扫描设备&#xff0c;将驱…

bluecmsphp代码审计

bluecms代码审计 (一) 运行环境需求&#xff1a; 可用的 httpd 服务器&#xff08;如 Apache、Zeus、IIS 等&#xff09; PHP 4.3.0 及以上 MySQL 4.1 及以上配置文件审计 看到uploads/install/include/common.inc.php 当然我们可能自己根本不知道那个是重要的文件&#x…

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

exceljs在Jquery&#xff08;HTML&#xff09;和vue项目中实现导出功能 前言Jquery&#xff08;HTML&#xff09;中实现导出第一步&#xff0c;先在项目本地中导入exceljs和file-saver包第二步&#xff0c;封装导出Excel方法&#xff08;可直接复制粘贴使用&#xff09;第三步&…

Java 实现 B树(通俗易懂)

目录 一.概念 二.节点定义 三.插入操作 1.查找位置 2.插入 3.分裂 四.B树和B*树 1.B树 2.B*树 一.概念 B树是一颗多叉平衡树&#xff0c;空树也是多叉平衡树。 一颗M阶的B树要满足以下条件&#xff1a; 1.根节点至少有两个孩子&#xff1b; 2.每个非根节点至少有(上…

机械学习—零基础学习日志(如何理解线性代数2)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 引言 在平面中&#xff0c;直线的定义可以理解为&#xff0c;任意缩放同一个平面向量得到所有点的集合。 所以要得到一个三维空间中的直线&#xff0c;只需要将这个向量改成三维向量即可。 什么是线…

uniapp加载第三方字体方案对比(附原生微信小程序方案)

文章目录 官方文档uniapp文档微信小程序文档 下载字体包引入方案限制微信小程序限制uniapp的限制 方案对比方案1&#xff1a;CSS本地加载方案2&#xff1a;CSS远程加载方案3&#xff1a;转换为base64&#xff0c;然后通过css引入方案4&#xff1a;使用uni.loadFontFace() 页面使…

(Jmeter、Fiddler)脚本转换Loadrunner脚本

背景&#xff1a;公司政治任务、各种体系文档要留档&#xff0c;但有些不在体系内的工具生成的脚本需要转化到体系内以备留档。 一、Loadrunner代理设置 开始录制配置&#xff1a; Record->Remote Application via LoadRunner Proxy LoadRrunner Proxy listens on port-…

米联客-FPGA程序设计Verilog语法入门篇连载-19 Verilog语法_低功耗设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的低功…

Spark MLlib 特征工程(下)

Spark MLlib 特征工程(下) 前面我们提到&#xff0c;典型的特征工程包含如下几个环节&#xff0c;即预处理、特征选择、归一化、离散化、Embedding 和向量计算&#xff0c;如下图所示。 在上一讲&#xff0c;我们着重讲解了其中的前 3 个环节&#xff0c;也就是预处理、特征选…

java---概念

一.配置环境&#xff08;三个变量&#xff09; 1.JAVA_HOME&#xff08;记录Java安装文件的路径&#xff09; 2.PATH&#xff08;系统直找的路径&#xff09; 3.CLASSPATH&#xff08;Java程序路径&#xff09; .;%JAVA_HOME%\lib 二.第一个Java程序 源代码&#xff1a; so…

使用kimi快速完成论文仿写的提示词,我帮你总结好了

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在完成论文写作时&#xff0c;很多人都会想到“仿写”&#xff0c;但正确的做法是借鉴而非复制。今天我们将分享如何利用Kimi智能助手来提高论文写作的效率和质量&#xff0c;同时确保原…

Kubernetes快速入门

一、容器集群管理概述 1.1背景概述 容器技术的诞生虽解决了应用打包和发布的难题&#xff0c;但单一的容器技术工具并无 法支持起生产级大规模容器部署的场景。针对这一场景&#xff0c;容器管理与编排成为了容器技术发展的关键。Kubernetes 便是在这样的大背景下诞生的。 1.2…