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

news2024/12/23 1:29:01

目录

    • 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) break
    println(i)
}

for(i in 1 until 5) {
    if(i == 3) continue
    println(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.coloradmin.cn/o/2041356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【nginx 第一篇章】认识一下 NGINX 服务器

一、简介 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。由俄罗斯程序员 Igor Sysoev 开发&#xff0c;并在2004年首次公开发布。Nginx 以其高并发处理能力、低内存消耗、稳定性、丰富的功能集、简单的配置以及低学…

硬件面试经典 100 题(31~50 题)

31、多级放大电路的级间耦合方式有哪几种&#xff1f;哪种耦合方式的电路零点偏移最严重&#xff1f;哪种耦合方式可以实现阻抗变换&#xff1f; 有三种耦合方式&#xff1a;直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重&#xff0c;变压器耦合的电路可以实现…

嘉立创eda泪滴

泪滴https://prodocs.lceda.cn/cn/pcb/tools-teardrop/

【1】设计模式简介

一.什么是设计模式 每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复劳动。 二.深入理解面向对象 向下&#xff1a;深入理解三大面向对象机制 封装&#xff0c;隐藏内部实现继承&am…

Linux SystemV(共享内存(*)、消息队列、信号量)

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 ​编辑 一、共享内存 1、原理 理解&#xff1a; 2、操作具体理解 1.概括 2.创建共享内存 共享内存的生命周期&#xff1f; key是什么&#xff1f; 进程怎么知道&#xff0c;共享内存是…

使用 FlexboxLayout 实现灵活布局

在 Android 开发中&#xff0c;有时我们需要让子视图根据内容和可用空间灵活排列。这时候&#xff0c;FlexboxLayout 是一个非常强大的工具&#xff0c;它类似于 CSS 中的 flexbox&#xff0c;允许我们轻松创建响应式布局。在这篇博客中&#xff0c;我们将详细介绍如何在 Andro…

原创度检测工具,快速检测文章原创值

原创度检测工具是帮助我们快速了解文章质量的工具&#xff0c;它能以最短的时间帮助我们了解到一篇文章的原创值是多少&#xff0c;并且还能帮助我们分析文章中哪些内容质量高&#xff0c;哪些内容质量低&#xff0c;从而对低质量的内容进行修改&#xff0c;达到提升整篇文章质…

Android App开发教学: 利用MediaPipe实现即时脸部侦测功能

前言 在Android开发中&#xff0c;实现即时脸部侦测功能是一个具有挑战性且引人注目的任务。幸运的是&#xff0c;Google的MediaPipe库为我们提供了一个简单且高效的解决方案。MediaPipe是一个开源的跨平台机器学习框架&#xff0c;可以用于各种视觉计算任务&#xff0c;包括脸…

C#泛型委托,约束

一、泛型委托 泛型的委托有很多&#xff0c;但掌握常见的泛型委托应用即可 委托可以定义它自己的类型参数。 引用泛型委托的代码可以指定类型参数以创建封闭式构造类型。 public delegate void Del<T>(T t);//Del<T> 是一个泛型委托 public static void Notify…

音频剪辑怎么剪?这4种裁剪方法快学起来

无论是音乐创作、播客录制还是专业的声音设计&#xff0c;高质量的音频剪辑都是创造引人入胜作品的关键。 然而&#xff0c;对于初学者或是专业人士而言&#xff0c;找到合适的音频剪辑工具&#xff0c;并掌握其使用方法&#xff0c;是通往成功道路上的第一步。 那么&#xf…

Python数据库操作必备:事务隔离级别全解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据库操作中&#xff0c;事务隔离是保证数据一致性和并发控制的重要机制。事务隔离级别决定了一个事务可以看到其他事务的哪些更改&#xff0c;常见的隔离级别包括未提交读&#xff08;Read Uncommitted&…

Java海康门禁设备 对接人脸下发API

海康门禁机设备API接口对接 引言&#xff1a; 我本人在对接海康门禁机设备的时候遇到了两个 问题1&#xff1a;人脸下发失败的问题&#xff0c;是根据官方的Demo&#xff0c;遇到的问题&#xff0c;可以参考一下 这个问题我排查了很久&#xff0c;最终发现是海康给的Demo里面…

EasyX自学笔记3(割草游戏2)

在上一篇笔记之中我们还留有许多bug&#xff0c;如派蒙不会转头、派蒙是鬼没影子、斜向速度过快、会跑出界外的问题在此一并处理。 在上一章里我们知道需要玩家类、敌人类、子弹类三种&#xff0c;但是其包含的是他们的运行逻辑和变量。而播放动画帧也有许多函数我们也将其封装…

学习Java的日子 Day68 jQuery操作节点,Bootstrap

jQuery 1.jQuery操作DOM DOM为文档提供了一种结构化表示方法&#xff0c;通过该方法可以改变文档的内容和展示形式 在访问页面时&#xff0c;需要与页面中的元素进行交互式的操作。在操作中&#xff0c;元素的访问是最频繁、最常用的&#xff0c;主要包括对元素属性attr、内容…

《Hadoop大数据技术与实践》+ 数仓版本

基础概念 随着数字化时代的到来&#xff0c;数据量的爆炸性增长使得传统的数据处理和分析方法变得不够高效&#xff0c;因此大数据技术应运而生。 数据分类 结构化数据&#xff1a;固定格式的SQL数据库等半结构化数据&#xff1a;json非结构化数据&#xff1a;图片、音视频 …

探索sqlmap的奥秘:Python中的强大SQL注入检测工具

文章目录 **探索sqlmap的奥秘&#xff1a;Python中的强大SQL注入检测工具**第一部分&#xff1a;背景介绍第二部分&#xff1a;sqlmap是什么&#xff1f;第三部分&#xff1a;如何安装sqlmap&#xff1f;第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第…

Grafana+Influxdb(Prometheus)+Apache Jmeter搭建可视化性能测试监控平台

此性能测试监控平台&#xff0c;架构可以是&#xff1a; GrafanaInfluxdbJmeterGrafanaPrometheusJmeter Influxdb和Prometheus在这里都是时序性数据库 在测试环境中&#xff0c;压测数据对存储和持久化的要求不高&#xff0c;所以这里的组件可以都通过docker-compose.yml文件…

制氧机在造纸工业中的作用

在现代造纸工业中&#xff0c;制氧机扮演着至关重要的角色&#xff0c;为整个生产流程带来了诸多显著的优势和改进。 制氧机能够优化纸浆的漂白过程。传统的漂白方法可能效果不佳&#xff0c;且对环境造成较大压力。而通过制氧机制备的高纯度氧气参与漂白反应&#xff0c;能大大…

Langchain pandas agent - Azure OpenAI account

题意&#xff1a;Langchain pandas代理 - Azure OpenAI账户 问题背景&#xff1a; I am trying to use Langchain for structured data using these steps from the official document. 我正在尝试使用 Langchain 处理结构化数据&#xff0c;按照官方文档中的这些步骤进行操作…